【Spring MVC】后端处理多文件上传如何保持最大的灵活性

文章目录

    • 前言
    • 找文档
    • Spring MVC 如何接收多文件
    • formdata 接收其他传参
    • 结论

前言

有一个多文件上传的需求,翻看了Spring MVC的官网,总结一下:

  • 如何根据版本号找官方文档
  • 后端如何声明Controller能保持较好的灵活性

找文档

  1. spring-framework 官方文档中心
  2. 选择需要的版本
  3. 点击 “spring-framework-reference”

【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第1张图片
4. 具体内容按板块点进去
【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第2张图片

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) {

    }

【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第3张图片


When the @RequestParam annotation is declared as a Map or MultiValueMap, 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

      • 对应的调用为:
        【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第4张图片
        【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第5张图片
    • MultiValueMap (这种方式一个key可以传多个文件)

      • 对应的调用方式为:
        【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第6张图片
        【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第7张图片

formdata 接收其他传参

类似 orderId 这种业务key也可以通过 formdata 传参
【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第8张图片

【Spring MVC】后端处理多文件上传如何保持最大的灵活性_第9张图片

结论

后端处理多文件上传,如果有可拓展性的要求,可以使用如下的方法声明 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";
    }

你可能感兴趣的:(spring,mvc,java)