Flutter 在发布 PNG 文件时收到来自 Fastapi 的 422 响应

Flutter receives 422 response from Fastapi when posting a PNG file

我已经用 FastAPI 创建了一个可用的本地主机 API。当我单击 FastAPI 生成的文档中的 'try it out' 按钮时,POST 接受一个 PNG,进行一些图像处理和 returns 一个 PNG : curl post命令显示如下:

curl -X 'POST' \
  'http://localhost:8345/api/predict' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@test_img.png;type=image/png'

已成功从图像选择器库中检索到图像文件。 (其中 image1 对象已在应用程序页面的 class.

中初始化为 File image1;
Future getImage() async {
    var imageTmp = await ImagePicker.pickImage(source: ImageSource.gallery);
    setState(() {
      image1 = imageTmp;
      print('Image Path $image1');
    });
  }

我尝试在 Flutter 中使用以下函数模拟 API 调用。

  doUpload() {
    /*
    curl -X 'POST' \
  'http://192.168.178.26:8345/api/predict' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'file=@test_img.png;type=image/png'

     */
    var request = http.MultipartRequest(
      'POST',
      Uri.parse("http://<my locally hosted ip>:8345/api/predict"),
    );
    Map<String, String> headers = {"Content-type": "multipart/form-data"};
    request.files.add(
      http.MultipartFile(
        'image',
        image1.readAsBytes().asStream(),
        image1.lengthSync(),
        filename: 'filename',
        contentType: MediaType('image', 'png'),
      ),
    );
    request.headers.addAll(headers);
    print("request: " + request.toString());
    request.send().then((value) => print(value.statusCode));
  }

当我运行 doUpload()函数时,一个POST成功发送到本地主机API,但是它returns一个422错误'unprocessable entity'。 我尝试了什么:

查看我的本地 UI 文件路径,我看到:

它没有显示名为缓存的文件夹,所以我不能这样检查它。但是图片选择器保存的最后是一个jpg(不是.jpg,这正常吗?)

要准确模仿 curl 命令,请使用:(为简单起见,我使用了方便的构造函数)

  final request = http.MultipartRequest(
    'POST',
    Uri.parse('http://<my locally hosted ip>:8345/api/predict'),
  );

  request.files.add(
    await http.MultipartFile.fromPath(
      'file', // NOTE - this value must match the 'file=' at the start of -F
      image1.path,
      contentType: MediaType('image', 'png'),
    ),
  );

  final response = await http.Response.fromStream(await request.send());

  print(response.body);