• SpringBoot项目中使用MultipartFile来上传文件(包含多文件)


    在实际项目中,会有通过前端上传单个文件,甚至多个文件的请求.
    本篇博客就会介绍后端如何实现这种类型的接口,以及如何使用postman去调用

    文章目录

    一. SpringBoot项目中使用MultipartFile上传单文件

    1.1 场景一: 上传单个文件,不包含其它参数

    1.1.1 后端实现, 在Controller层添加如下代码

     @RestController
    @RequestMapping("/test")
    public class MultipartFileController {
        @PostMapping
        public String multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile multipartFile) throws Exception{
            File file = new File("E:\data\test\testFile");
            multipartFile.transferTo(file);
            return file.getAbsolutePath();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    上述代码实现的主要功能是,接受接口调用传入的文件,转换为本地文件,并返回本地文件的绝对路径

    1.1.2 postman接口调用

    首先接口类型是Post, Headers里需要添加
    key: Content-Type , value:multipart/form-data;
    在这里插入图片描述

    请求体里, 首先:
    要选择from-data这种方式,key的格式设置为File,key的值为multipartFile(这里不唯一,实际情况根据后端定义的参数值名称来确定), 然后随便选择一个文件上传
    在这里插入图片描述
    调用接口,返回了生成文件的路径
    在这里插入图片描述
    在资源管理器查看这个文件内容和上传的文件一致
    在这里插入图片描述

    1.2 场景二: 上传单个文件,包含其它参数

    1.2.1 java后台代码

    后台代码,只需要通过@RequestParam指定接口调用的参数即可,没有特殊的地方

        @PostMapping
        public String multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile multipartFile,
                                        @ApiParam(value = "用户名") @RequestParam  String username,
                                        @ApiParam(value = "邮箱") @RequestParam String email) throws Exception{
            File file = new File("E:\data\test\testFile");
            multipartFile.transferTo(file);
            return "path: " + file.getAbsolutePath() + " username: " + username + " email: " + email;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.2.2 postman接口调用

    在form-data里添加对应的参数即可,注意key的格式是默认的Text类型,
    调用也是正常的
    在这里插入图片描述

    1.3 场景三: 上传单个文件,包含其它请求实体

    1.3.1 后端实现

    首先创建一个最简单的实体类

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * @author xmr
     * @date 2022/4/17 10:51
     * @description
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserDO {
        private String username;
        private String email;
        private int age;
        private String address; 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    crontroller代码,注意: 这里不要用常规的@RequestBody,访问接口的时候会报错Unsupported Media Type,而是应该使用@Valid注解,
    javax.validation包下,后台代码如下:

        @PostMapping
        public String multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile multipartFile,
                                        @ApiParam(value = "用户名") @Valid UserDO userDO
                                     ) throws Exception{
            File file = new File("E:\data\test\testFile");
            multipartFile.transferTo(file);
            return  userDO.toString();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.3.2 postman接口调用

    这里和常规的RequestBody也是有区别的,就是将实体类的每个属性值当做单独的key上传上来
    在这里插入图片描述

    二. SpringBoot项目中使用MultipartFile上传多文件

    2.1 上传多个文件,不包含其它参数

    2.1.1后端实现

    为了更直观的展示,这里返回一个JSONObject对象, 输出每个文件的大小

        @PostMapping
        public JSONObject multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile [] multipartFiles
                                     ) throws Exception{
            JSONObject jsonObject = new JSONObject();
            for(int i = 0; i < multipartFiles.length; i++) {
                jsonObject.put("file" + i, multipartFiles[i].getSize());
            }
    
           return jsonObject;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.1.2 postman接口调用

    这里有个特殊的地方,就是不管传多少文件,key首先是file类型,其次命名均为multipartFiles(同样,这里由后台接口命名时确定)
    我这里上传了4个正常文件和一个一个空的


    最终接口返回结果:
    在这里插入图片描述

    2.2 上传多个文件,包含其它参数

    2.2.1 后端接口代码

        @PostMapping
        public JSONObject multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile [] multipartFiles, 
                                            @RequestParam String username,
                                            @RequestParam int age
                                     ) throws Exception{
            JSONObject jsonObject = new JSONObject();
            for(int i = 0; i < multipartFiles.length; i++) {
                jsonObject.put("file" + i, multipartFiles[i].getSize());
            }
            jsonObject.put("username", username);
            jsonObject.put("age", age);
           return jsonObject;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.2.2 postman接口调用

    没什么特殊的地方,key增加对应的属性即可
    在这里插入图片描述

    2.3 上传多个文件,包含其它请求体

    2.3.1 后台代码

    同1.3 请求体需要使用@Valid注解而不是@RequestBody

       @PostMapping
        public JSONObject multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile [] multipartFiles,
                                            @Valid UserDO userDO
                                     ) throws Exception{
            JSONObject jsonObject = new JSONObject();
            for(int i = 0; i < multipartFiles.length; i++) {
                jsonObject.put("file" + i, multipartFiles[i].getSize());
            }
            jsonObject.put("user", userDO.toString());
           return jsonObject;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2.3.2 postman接口调用

    multipartFiles参数后面依次添加实体类里面的每一个属性值即可
    如下图:
    在这里插入图片描述

    2.4 复杂场景测试,既包含一个文件,也包含多个文件,同时包含参数和请求体

    2.4.1后台代码

      @PostMapping
        public JSONObject multipartFileTest(@ApiParam(value = "multipartFile") @RequestParam MultipartFile [] multipartFiles,
                                            @RequestParam MultipartFile multipartFile,
                                            @RequestParam String paramTest,
                                            @Valid UserDO userDO
                                     ) throws Exception{
            JSONObject jsonObject = new JSONObject();
            for(int i = 0; i < multipartFiles.length; i++) {
                jsonObject.put("file" + i, multipartFiles[i].getSize());
            }
            jsonObject.put("user", userDO.toString());
            jsonObject.put("paramTest", paramTest);
            jsonObject.put("multipartFile", multipartFile.getSize());
           return jsonObject;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2.4.2 postman接口调用

    注意事项: 文件的上传key需要选择File格式,同时参数名应该与后端代码约定的保持一致,
    对象依旧是把对象的每个属性单独作为参数

    在这里插入图片描述
    相信有了2.4这个案例, 项目中上传文件需求的任何场景应该都能够满足了

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    基于Java毕业设计榆林学院学术成果申报与管理源码+系统+mysql+lw文档+部署软件
    (附源码)小程序springboot心理治愈 毕业设计 041506
    8.javase_数组2
    【Beyond Compare】大小写对比的设置
    【C++】---STL之list的模拟实现
    Google搜索操作符:让你秒变搜索专家
    Qt 序列化函数和反序列化函数
    【DSP】【第五篇】RBL源代码分析
    SDRAM 控制器(三)——自动刷新模块
    Oracle/PLSQL: Covar_samp Function
  • 原文地址:https://blog.csdn.net/m0_54850467/article/details/126064164