问题
在上传文件数组的时候,后端总是收不到文件数组。检查本地数据发现没有问题。
问题出现在FormData对文件的处理上,如果直接用FormData.map处理数据类似下面这样,对于单张/单个文件的上传是没有影响的。
Map<String, dynamic> formMap = {
'nickname': nickname,
'motto': motto,
};
formMap['avatar'] = MultipartFile.fromBytes(avatar,
filename:avatarName ?? '${DateTime.now().millisecondsSinceEpoch}.jpg');
多文件上传时,通过给key加中括号“[]”方式作为文件数组的标记,大多数后台也会通过key[]这种方式来读取。不过RFC中并没有规定多文件上传就必须得加“[]”,所以有时不带“[]”也是可以的,关键在于后台和客户端得一致。
v3.0.0 以后通过Formdata.fromMap()创建的Formdata,如果有文件数组,是默认会给key加上“[]”的
最终编码时会key会为 “files[]”,如果不想添加“[]”,可以通过Formdata的API来构建,如下面解决方法一
解决
采用对FormData的fields和file单独赋值解决,这种不会默认添加"[]"
var formData = FormData();
Map<String, String> fields = {
'type': message.type,
'content': message.content,
'communication': message.communication,
};
form.fields.addAll(fields.entries);
formData.files.addAll([
MapEntry(
"files",
MultipartFile.fromFileSync("./example/upload.txt",
filename: "upload.txt"),
),
MapEntry(
"files",
MultipartFile.fromFileSync("./example/upload.txt",
filename: "upload.txt"),
),
]);
下面这一种是默认添加"[]"的
FormData.fromMap({
"name": "wendux",
"age": 25,
"file": await MultipartFile.fromFile("./text.txt",filename: "upload.txt"),
"files": [
await MultipartFile.fromFile("./text1.txt", filename: "text1.txt"),
await MultipartFile.fromFile("./text2.txt", filename: "text2.txt"),
]
});
response = await dio.post("/info", data: formData);