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

2年前 (2022) 程序员胖胖胖虎阿
400 0 0

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

文章目录

  • 一. SpringBoot项目中使用MultipartFile上传单文件
    • 1.1 场景一: 上传单个文件,不包含其它参数
      • 1.1.1 后端实现, 在Controller层添加如下代码
      • 1.1.2 postman接口调用
    • 1.2 场景二: 上传单个文件,包含其它参数
      • 1.2.1 java后台代码
      • 1.2.2 postman接口调用
    • 1.3 场景三: 上传单个文件,包含其它请求实体
      • 1.3.1 后端实现
      • 1.3.2 postman接口调用
  • 二. SpringBoot项目中使用MultipartFile上传多文件
    • 2.1 上传多个文件,不包含其它参数
      • 2.1.1后端实现
      • 2.1.2 postman接口调用
    • 2.2 上传多个文件,包含其它参数
      • 2.2.1 后端接口代码
      • 2.2.2 postman接口调用
    • 2.3 上传多个文件,包含其它请求体
      • 2.3.1 后台代码
      • 2.3.2 postman接口调用
    • 2.4 复杂场景测试,既包含一个文件,也包含多个文件,同时包含参数和请求体
      • 2.4.1后台代码
      • 2.4.2 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.1.2 postman接口调用

首先接口类型是Post, Headers里需要添加
key: Content-Type , value:multipart/form-data;
SpringBoot项目中使用MultipartFile来上传文件(包含多文件)

请求体里, 首先:
要选择from-data这种方式,key的格式设置为File,key的值为multipartFile(这里不唯一,实际情况根据后端定义的参数值名称来确定), 然后随便选择一个文件上传
SpringBoot项目中使用MultipartFile来上传文件(包含多文件)
调用接口,返回了生成文件的路径
SpringBoot项目中使用MultipartFile来上传文件(包含多文件)
在资源管理器查看这个文件内容和上传的文件一致
SpringBoot项目中使用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.2 postman接口调用

在form-data里添加对应的参数即可,注意key的格式是默认的Text类型,
调用也是正常的
SpringBoot项目中使用MultipartFile来上传文件(包含多文件)

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; 
}

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.3.2 postman接口调用

这里和常规的RequestBody也是有区别的,就是将实体类的每个属性值当做单独的key上传上来
SpringBoot项目中使用MultipartFile来上传文件(包含多文件)

二. 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;
    }

2.1.2 postman接口调用

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

SpringBoot项目中使用MultipartFile来上传文件(包含多文件)
最终接口返回结果:
SpringBoot项目中使用MultipartFile来上传文件(包含多文件)

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;
    }

2.2.2 postman接口调用

没什么特殊的地方,key增加对应的属性即可
SpringBoot项目中使用MultipartFile来上传文件(包含多文件)

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;
    }

2.3.2 postman接口调用

multipartFiles参数后面依次添加实体类里面的每一个属性值即可
如下图:
SpringBoot项目中使用MultipartFile来上传文件(包含多文件)

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;
    }

2.4.2 postman接口调用

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

SpringBoot项目中使用MultipartFile来上传文件(包含多文件)
相信有了2.4这个案例, 项目中上传文件需求的任何场景应该都能够满足了

相关文章

暂无评论

暂无评论...