当前位置: 首页 > 知识库问答 >
问题:

如何解决400状态码和意外字符(字符1处)错误?

焦宏硕
2023-03-14

我有一个机器学习模型,可以拍摄图片并返回预测结果,我将其上传到flask服务器,并在我使用HTML创建的网站上进行测试,结果成功,但是,当我尝试将它与flifter应用程序一起使用时,当我尝试从应用程序上载图片时,会出现以下错误:未处理的异常:FormatException:意外字符(在字符1处)。另外,我得到的状态码是400。。这是我的密码。任何帮助都将不胜感激。

这是我在其中创建flask实例的python代码(当我尝试使用Flatter应用程序建立连接时,我在cmd上运行它)

from flask import Flask, render_template, request, jsonify
import cv2
import numpy as np
import pandas as pd
import tensorflow
from tensorflow import keras
from tensorflow.python.keras import backend as k

app = Flask(__name__)

model = tensorflow.keras.models.load_model('model.h5')


@app.route('/')
def index():
    return render_template("index.html", data="hey")


@app.route("/prediction", methods=["POST"])
def prediction():

    
    img = request.files['img']  
    img.save("img.jpg")
    image = cv2.imread("img.jpg")
    image = cv2.resize(image, (224,224))
    image = np.reshape(image, (1,224,224,3))
    pred = model.predict(image)

    pred = pred > 0.5
    if(pred):
        predd="Malignant"
    else:
        predd="Benign"

    return jsonify({"prediction": predd,})
    
#this ip is my network's IPv4
#(I connected both my laptop and mobile to this WiFi while establishing the connection)
if __name__ == "__main__":
    app.run(debug=False,host='192.168.1.103',port=5000)

这是我在颤振中用来建立连接的代码

  sendImageToServer(File imageFile) async {
    var stream = new http.ByteStream(imageFile.openRead());
    stream.cast();
    var length = await imageFile.length();
    print(length);
    
    //this ip is my network's IPv4 
    //(I connected both my laptop and mobile 
    //to this WiFi while establishing the connection) 

    var uri = Uri.parse('http://192.168.1.103:5000/prediction');
    var request = new http.MultipartRequest("POST", uri);
    var multipartFile = new http.MultipartFile('file', stream, length,
        filename:
            basename(imageFile.path));

    request.files.add(multipartFile);
    request.headers["Content-Type"] = 'multipart/form-data';
    var streamedResponse = await request.send();
    var response = await http.Response.fromStream(streamedResponse);
    
    print(response);

    final Map<String, dynamic> responseJson =
        json.decode(response.toString()) as Map<String, dynamic>;
    print(responseJson.toString());

    pre = responseJson["prediction"];
    print(pre);

    setState(() {
      prediction = pre;
    });
  }

  Future getImage() async {
    final image = await picker.getImage(source: ImageSource.gallery);
    sendImageToServer(File(image.path));

    setState(() {
      fileImage = File(image.path);
      sendImageToServer(fileImage);
    });
  }

这也是我发送请求时在cmd上得到的信息

192.168.1.108 - - [20/Mar/2021 19:14:39] "←[1m←[31mPOST /prediction HTTP/1.1←[0m" 400 -

共有1个答案

经和歌
2023-03-14

所以你得到的例外是告诉你服务器无法理解你发送的请求,我认为现在的问题是你在这里发送的请求的密钥

var multipartFile = new http.MultipartFile('file', stream, length,
        filename:
            basename(imageFile.path));

在您的后端,您正在使用密钥"img"

img = request.files['img']  

所以这些应该是一样的,试试下面的

var multipartFile = new http.MultipartFile('img', stream, length,
        filename:
            basename(imageFile.path));

我真的希望这将工作,也检查下面的链接,它可能会帮助你理解更多的问题,

https://dev.to/carminezacc/advanced-flutter-networking-part-1-uploading-a-file-to-a-rest-api-from-flutter-using-a-multi-part-form-data-post-request-2ekm

还有这个问题

错误消息没有明确错误的确切位置,所以这样做,将您的代码添加到一个尝试捕获块中,这样您就可以捕获抛出的任何异常并知道错误是什么。

try {
sendImageToServer(File imageFile) async {
    var stream = new http.ByteStream(imageFile.openRead());
    stream.cast();
    var length = await imageFile.length();
    print(length);
    
    //this ip is my network's IPv4 
    //(I connected both my laptop and mobile 
    //to this WiFi while establishing the connection) 

    var uri = Uri.parse('http://192.168.1.103:5000/prediction');
    var request = new http.MultipartRequest("POST", uri);
    var multipartFile = new http.MultipartFile('file', stream, length,
        filename:
            basename(imageFile.path));

    request.files.add(multipartFile);
    request.headers["Content-Type"] = 'multipart/form-data';
    var streamedResponse = await request.send();
    var response = await http.Response.fromStream(streamedResponse);
    
     //print(response);//this will print instance of response not the response itself
     // i cleared this a bit so we can trace where the error started from
     print(response.statusCode); // the status code of your response
     print(response.reasonPhrase); // the reason it failed "in case it did"
     print(response.body); // the body of the response -> this what you really interested in

  }
} catch (e,s) {
  // this is your life saver, it will tell you everything 
  // you need to know to trace the error (well mostly :D)
  // note : this will catch any exceptions that is thrown in the code, this not related to the response
  // the (e) is error it self so your should print that to know what is the error
  print(e.toString());
  // the (s) is the stackTrace, it will tell you when and where the error 
  // happened, so you should also print it
  print(e.toString());
}
 类似资料:
  • 在Flutter中,无论我尝试解码什么json文件,我都会得到上面相同的标题错误。最初我认为这是我的项目,但在开始一个新的模板Flutter项目后,我仍然收到同样的错误。我有json文件在我的根文件夹,并已将它们添加到pubspec.yaml文件: 主要的目前的dart代码: 我已经在多个测试站点验证了我的json数据,并在Flutter文档中尝试了各种方法。Json数据:

  • 我的客户说他使用我的脚本得到了这个错误: phpheader.php中的第34行就是

  • 嘿,我遇到了一个关于与jackson反序列化的问题,这里是我尝试过的和我得到的错误。 错误:com。fasterxml。杰克逊。果心JsonParseException:意外字符('}'(代码125)):应以双引号开始字段名 Java代码 我的JSON

  • 问题内容: 我收到此错误: JSON.parse:意外字符 当我在firebug中运行以下语句时: 为什么会这样呢?JSON字符串对我来说似乎是正确的,我也使用JSHint对其进行了测试。在上述情况下,传递的对象是服务器响应,其内容类型设置为 问题答案: 您不是在解析字符串,而是在解析一个已经解析的对象:)

  • 问题内容: 由于某种原因,我收到一条错误消息,但是实际上并没有在读取的任何代码中加下划线。我尝试清洁和重建它,但是没有用。它说它在第49行。 我的代码如下 下面的第49行 问题答案: 你内有两个“奇数”字- U + 200C (零宽不连字)和U + 200B (零宽度的空间)的第一个“e”和“m”个之间。“ l”和“ i”之间的“点击”中出现相同的字符。 只需删除并重新输入这些单词,错误就会消失。

  • 我收到以下错误消息: 这是给我带来麻烦的一行代码。 我使用的是PHP5.2。9和升级不是一个选项。 正则表达式不是我的专长,我无法独自解决这个问题。任何帮助都将不胜感激。