使用Ajax和Spring MVC上传多个文件

8

我可以帮助您翻译,这段文字是关于使用FormData和Spring上传多个文件的。

HTML:

<input type="file" name="img" multiple id="upload-files">

JS代码:

var ajaxData = new FormData();
var files = $('#upload-files').prop('files');
for(var i=0;i<files.length;i++){
    ajaxData.append('file['+i+']', files[i]);
}
ajaxData.append("file", files);
$http.post('../rest/upload', ajaxData, {
    headers: {'Content-Type': undefined },
    transformRequest: angular.identity
});

Spring控制器代码:

@RequestMapping(value = "/upload", produces="application/json", method = RequestMethod.POST)
@ResponseBody
public String upload(
        @RequestParam ArrayList<MultipartFile> files
){
    System.out.println(files.size());
    return null;
}

然而,当提交多个文件的请求时,文件计数为0。在使用MultipartFile[] files数组符号而不是ArrayList时,会返回400个错误请求。

如何使Spring控制器与多个文件一起工作?我无法在其他SO问题中找到解决方案。


你尝试过将List<MultipartFile>重定位到一个对象,并在spring-servlet.xml上配置CommonsMultipartResolver和InternalResourceViewResolver吗? - clbcabral
你在表单提交按钮中正确添加了encType吗?例如:<form enctype="multipart/form-data" action="uploadFile.jsp" method="POST">和输入类型为<input type="file" name="file[]" multiple />。 - Ravindra babu
1个回答

5

默认情况下,DataBinder 尝试使用规则来绑定请求参数到目标对象——请求中的参数名称(在您的情况下是 FormData)必须与控制器操作中的参数名称匹配。

在您的情况下,您应该将 file[i] 重命名为 files[i]

for(var i=0; i < files.length; i++){
    ajaxData.append('files[' + i + ']', files[i]);
}

或者将操作的参数从ArrayList<MultipartFile> files改为ArrayList<MultipartFile> file


此外,删除这行代码ajaxData.append("file", files);(位于for循环之后),因为它正在设置一个具有相同名称的参数,可能会发生某种故障。

希望这可以帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接