在实际项目中,会有通过前端上传单个文件,甚至多个文件的请求.
本篇博客就会介绍后端如何实现这种类型的接口,以及如何使用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;
请求体里, 首先:
要选择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.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;
}
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上传多文件
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个正常文件和一个一个空的
最终接口返回结果:
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增加对应的属性即可
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
参数后面依次添加实体类里面的每一个属性值即可
如下图:
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
格式,同时参数名应该与后端代码约定的保持一致,
对象依旧是把对象的每个属性单独作为参数
相信有了2.4这个案例, 项目中上传文件需求的任何场景应该都能够满足了