使用FormData和MultiFormData在带有Dio的Futter中发送文件图像时出现问题

时间:2020-04-19 15:47:16

标签: flutter multipartform-data dio

有人使用Dio并发送“ MultiPart FormData”时遇到此错误吗?

FormData formData = FormData.fromMap({
  "target_value": listaDados[0],
  "number_installments": listaDados[1],
  "installments_frequency": listaDados[2],
  "modality": listaDados[3],
  "gross_billing": listaDados[4],
  "hectare_cost": listaDados[5],
  "files": [
    MultipartFile.fromFile("${listaDados[6]}",
        filename: "Foto_Identidade"),
    MultipartFile.fromFile("${listaDados[7]}",
        filename: "Foto_Imposto.jpg"),
    MultipartFile.fromFile("${listaDados[8]}",
        filename: "Selfie_Autorizacao.jpg"),
  ]
});
//dio.options.baseUrl = "${global.CONEXAO}";
dio.interceptors.add(LogInterceptor());
response = await dio.post("${global.CONEXAO}/credits",
    data: await formData,
    options: Options(headers: {
      'Authorization':
          'Bearer $token'
    }));
print(response.data);

当我这样发送时,它的状态为200,发送所有数据,但是文件是[] ....

如果我在MultiPart.fromfile之前等待,它将给出错误500和[MapEntry(文件[]:'MultipartFile'的实例),MapEntry(文件[]:'MultipartFile'的实例),MapEntry(文件[]:“ MultipartFile”的实例))...

  • 这些照片是使用imagePicker拍摄的,并保存在流中!

  • 确实有一个文件,我预先打印列表并显示文件的路径和名称! 有人知道我能做什么吗?谢谢

1 个答案:

答案 0 :(得分:0)

我今天遇到了同样的问题,因为地图在后端获得了相同的密钥,所以我最终无法获得所有文件,所以我将源代码更改如下:

  FormData.fromMap(Map<String, dynamic> map) {
_init();
encodeMap(
  map,
  (key, value) {
    if (value == null) return null;
    if (value is MultipartFile) {
      files.add(MapEntry( value.filename, value)); //here is what I changed
    } else {
      fields.add(MapEntry(key, value.toString()));
    }
    return null;
  },
  encode: false,
);

}

当我更改源代码并重建我的应用程序时,一切正常,我可以使用文件名作为密钥。

如果您深入研究encodeMap源代码,您会发现dio使用递归获取条目的所有键,值

但是当进入List中的MultipartFile时,此递归的入口为urlEncode(data, '');,路径为空,最后我们得到类似'$path$leftBracket${(sub[i] is Map || sub[i] is List) ? i : ''}$rightBracket');的东西,结果就是这样的

ImmutableMultiDict([('files[]', <FileStorage: 'image_picker677442617592930907_compressed1516097521471936562.jpg' ('application/octet-stream')>), ('files[]', <FileStorage: 'image_picker5187767999094318232_compressed6097930966098340000.jpg' ('application/octet-stream')>)])