我正在使用formData发送多个文件,像这样

javascript - 发送二维文件数组的问题-LMLPHP

在我的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
javascript - 发送二维文件数组的问题-LMLPHP

在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;

无需初始化即可工作。

08-28 14:33