You*_*sef 9 javascript java spring spring-mvc
我发送多个文件以formData这样的
在我的Spring MVC Controller中
@PostMapping(value = "/marches")
public Integer saveMarches(
@RequestPart("formJson") FooBean formJson,
@RequestPart("attachOs") MultipartFile[][] attachOs
) throws IOException {
...
}
Run Code Online (Sandbox Code Playgroud)
我的conf:
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(30000000);
return multipartResolver;
}
Run Code Online (Sandbox Code Playgroud)
但是我400 Bad Request在浏览器中找到了
在IDE中,我得到了:
Run Code Online (Sandbox Code Playgroud)Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'attachOs' is not present]
如果我尝试,@RequestPart("attachOs[][]") MultipartFile[][] attachOs我总是收到一个不好的要求Required request part 'attachOs[][]' is not present
问题是显而易见的:春天只是在寻找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,
})
...
Run Code Online (Sandbox Code Playgroud)
我的formJson结构是
{
// form fields
...
os: [
{
// os form fields
...
attachment: [{ /* File type */ }, ...], // multiple files per os
},
...
]
}
Run Code Online (Sandbox Code Playgroud)
我知道文件无法与JSON一起发送,这就是为什么我在上面构造formData的原因,之后我将从JSON结构中删除附件属性
所以我的问题是:
1.如何解决错误的请求问题?
2.是否有其他方法或设计模式来处理此用例?
@ModelAttribute我通过利用(来自此处)找到了解决方案;
首先创建一个模型类,例如;
public class MyRequest {
private FooBean formJson;
private MultipartFile[][] attachOs = new MultipartFile[2][2];
// getters/setters
}
Run Code Online (Sandbox Code Playgroud)
然后将其添加到您的控制器中,例如;
@PostMapping(value = "/marches", consumes = "multipart/form-data")
public Integer saveMarches(@ModelAttribute MyRequest request) throws IOException {
// some code
}
Run Code Online (Sandbox Code Playgroud)
重要的部分是 的初始化MultipartFile[][] attachOs,否则由于某些内部初始化问题,它无法用于多维数组。
或者您可以在模型类中使用以下类型;
private List<MultipartFile>[] attachOs;
Run Code Online (Sandbox Code Playgroud)
无需初始化即可工作。
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |