文章目录
- 前言
- 找文档
- 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";
    }



















