文章目录
- 前言
- 找文档
- Spring MVC 如何接收多文件
- formdata 接收其他传参
- 结论
前言
有一个多文件上传的需求,翻看了Spring MVC的官网,总结一下:
- 如何根据版本号找官方文档
- 后端如何声明Controller能保持较好的灵活性
找文档
- spring-framework 官方文档中心
- 选择需要的版本
- 点击 “spring-framework-reference”
4. 具体内容按板块点进去
Spring MVC 如何接收多文件
5.2.15 版本 官方介绍了几种写法, 值得注意的是以下的信息:
Declaring the argument type as a List allows for resolving multiple files for the same parameter name.
- 言下之意是以下Controller 可以接收多个文件
@PostMapping("/form")
public String handleFormUpload(@RequestParam("files") List<MultipartFile> files) {
}
When the @RequestParam annotation is declared as a Map<String, MultipartFile> or MultiValueMap<String, MultipartFile>, without a parameter name specified in the annotation, then the map is populated with the multipart files for each given parameter name.
- 言下之意是
@RequestParam("files")
改成@RequestParam
后 (这里一定要改,不然会报错),可以使用以下参数来接收上传的文件-
Map<String, MultipartFile>
- 对应的调用为:
- 对应的调用为:
-
MultiValueMap<String, MultipartFile>
(这种方式一个key可以传多个文件)- 对应的调用方式为:
- 对应的调用方式为:
-
formdata 接收其他传参
类似 orderId 这种业务key也可以通过 formdata 传参
结论
后端处理多文件上传,如果有可拓展性的要求,可以使用如下的方法声明 Controller。对应的key可以发展为策略模式的key
@PostMapping("upload4MultiKeyAndValue")
@ResponseBody
public String upload4MultiKeyAndValue(@RequestParam MultiValueMap<String, MultipartFile> files, @RequestParam("orderId") String orderId) throws IOException {
for (Map.Entry<String, List<MultipartFile>> entry : files.entrySet()) {
List<MultipartFile> fileList = entry.getValue();
for (MultipartFile multipartFile : fileList) {
log.info("key : {} filename : {}", entry.getKey(), multipartFile.getOriginalFilename());
// TODO 可以根据 key 实现策略模式, 每个key还可以对应多个文件
}
}
return "success";
}