发送二维文件数组的问题

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中,我得到了:

Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException:
Required request part 'attachOs' is not present]
Run Code Online (Sandbox Code Playgroud)

如果我尝试,@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.是否有其他方法或设计模式来处理此用例?

bur*_*ete 1

@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)

无需初始化即可工作。