尝试使用ng-file-upload上传Spring中的许多文件时,清单

我有以下控制器方法一次上传多个文件,受此博客文章的启发以及这个问题的答案:

@RequestMapping(value = "/{user}/attachment", method = RequestMethod.POST) @PreAuthorize(...) public void upload(@PathVariable User user, @RequestParam("file") List files) { // handle files } 

但是,尽管请求包含文件列表,但文件列表始终为空。

如果我将第三个MultipartRequest参数添加到方法:

 public void upload(@PathVariable User user, @RequestParam("file") List files, MultipartRequest request) 

我可以看到它正确包含我上传的文件:

请求内容

List的原因可能是什么?

我正在使用ng-file-upload提交文件,但我不认为它与问题有关。 春季4.2.4。

问题是ng-file-upload默认使用名称file[0]file[1]等提交文件数组。使用Upload服务时,可以使用arrayKey值进行配置。 将其设置为空字符串会强制在同一file密钥下发送file ,这可以通过Spring正确解析,而@RequestParam("file") List包含已提交的所有文件。

 Upload.upload({url: url, data: {file: arrayOfFiles}, arrayKey: ''}) 

尝试像这样使用@ModelAttribute

  @RequestMapping(value = "/{user}/attachment", method = RequestMethod.POST) @PreAuthorize(...) public void upload(@PathVariable User user,@ModelAttribute("uploadFile") FileUpload uploadFile) throws IllegalStateException, IOException { List files = uploadFile.getFiles(); ... 

并创建一个类,如:

  public class FileUpload { private List files; public List getFiles() { return files; } public void setFiles(List files) { this.files= files; } } 

我认为,从前面发送数据的方式来看,它不能与java.util.List 绑定 。 如果您根据请求创建JSON数据,并使用@RequestBody注释您的List,例如:

 @RequestMapping(value = "/{user}/attachment", method = RequestMethod.POST) @PreAuthorize(...) public void upload(@PathVariable User user, @RequestBody List files) { // handle files } 

这应该工作。 这里有一些信息。