我正在使用formData
发送多个文件,像这样
在我的Spring MVC Controller中
@PostMapping(value = "/marches")
public Integer saveMarches(
@RequestPart("formJson") FooBean formJson,
@RequestPart("attachOs") MultipartFile[][] attachOs
) throws IOException {
...
}
我的conf:
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(30000000);
return multipartResolver;
}
但是我在浏览器中收到了
400 Bad Request
在IDE中,我得到了:
如果我尝试
@RequestPart("attachOs[][]") MultipartFile[][] attachOs
,我总是收到Required request part 'attachOs[][]' is not present
的错误请求问题很明显:spring仅在搜索
attachOs
部分(@RequestPart("attachOs")
),但是我正在发送attachOs[0][0]
,attachOs[0][1]
...当我仅发送不带文件的
formJson
部分时,或者如果我仅发送单个文件@RequestPart("attachOs") MultipartFile attachOs
或文件@RequestPart("attachOs") MultipartFile[] attachOs
的一维数组,则一切正常。JavaScript代码:
const formData = new FormData();
for (const [i, os] of formJson.os.entries()) {
if(os.attachment) {
for (const [j, file] of [...os.attachment].entries()) {
formData.append(`attachOs[${i}][${j}]`, file );
}
}
}
...
formData.append('formJson',
new Blob([JSON.stringify(formJson)], {type:'application/json'}));
...
axios({
url: ...,
method: 'POST',
data: formData,
})
...
我的
formJson
结构是{
// form fields
...
os: [
{
// os form fields
...
attachment: [{ /* File type */ }, ...], // multiple files per os
},
...
]
}
我知道文件无法与JSON一起发送,这就是为什么我在上面构造formData的原因,之后我将从JSON结构中删除附件属性
所以我的问题是:
1. 如何解决错误的请求问题?
2. 还有另一种方法或设计模式来处理此用例吗?
最佳答案
我通过使用@ModelAttribute
(来自here)找到了解决方案;
首先创建一个像这样的模型类;
public class MyRequest {
private FooBean formJson;
private MultipartFile[][] attachOs = new MultipartFile[2][2];
// getters/setters
}
然后像把它添加到您的 Controller 中;
@PostMapping(value = "/marches", consumes = "multipart/form-data")
public Integer saveMarches(@ModelAttribute MyRequest request) throws IOException {
// some code
}
重要的部分是
MultipartFile[][] attachOs
的初始化,否则由于某些内部初始化问题,它不适用于多维数组。或者,您可以在模型类中使用以下类型;
private List<MultipartFile>[] attachOs;
无需初始化即可工作。