有人使用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拍摄的,并保存在流中!
确实有一个文件,我预先打印列表并显示文件的路径和名称! 有人知道我能做什么吗?谢谢
答案 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')>)])