0

有没有人在使用 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 之前放置 await,它会给出错误 500 和 [MapEntry (files []: 'MultipartFile' 的实例)、MapEntry (files []: 'MultipartFile' 的实例)、MapEntry (files []: 'MultipartFile'的实例)] ...

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

  • 真的有一个文件,我事先打印列表并显示文件的路径和名称!有谁知道我能做什么?谢谢

4

1 回答 1

0

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

  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 使用递归来获取所有条目的 key,value

但是当来到 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')>)])
于 2020-06-04T03:22:47.723 回答