尝试使用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 }
这应该工作。 这里有一些信息。
- Java Server – 使用POST发送Push到Google Firebase Cloud
- 使用Selenium测试Angularjs应用程序
- 将jhipster后端和前端分成两个项目?
- 无法从JSON String实例化类型的值; 没有单字符串构造函数/工厂方法
- 如何使用AngularJS $ http发送multipart / form-data
- IE11 CORS拒绝https上的OPTIONS
- 如何组合现有的Google App引擎后端和AngularJS Web应用程序?
- 如何在angularjs中发送多个FIles以及表单数据
- 带有Spring Security的AngularJS Web应用程序