在实际项目中,会有通过前端上传单个文件,甚至多个文件的请求.
本篇博客就会介绍后端如何实现这种类型的接口,以及如何使用postman去调用
@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();
}
}
上述代码实现的主要功能是,接受接口调用传入的文件,转换为本地文件,并返回本地文件的绝对路径
首先接口类型是Post, Headers里需要添加
key: Content-Type
, value:multipart/form-data;
请求体里, 首先:
要选择from-data
这种方式,key的格式设置为File
,key的值为multipartFile
(这里不唯一,实际情况根据后端定义的参数值名称来确定), 然后随便选择一个文件上传
调用接口,返回了生成文件的路径
在资源管理器查看这个文件内容和上传的文件一致
后台代码,只需要通过@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;
}
在form-data里添加对应的参数即可,注意key的格式是默认的Text
类型,
调用也是正常的
首先创建一个最简单的实体类
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();
}
这里和常规的RequestBody也是有区别的,就是将实体类的每个属性值当做单独的key上传上来
为了更直观的展示,这里返回一个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;
}
这里有个特殊的地方,就是不管传多少文件,key首先是file类型,其次命名均为multipartFiles
(同样,这里由后台接口命名时确定)
我这里上传了4个正常文件和一个一个空的
@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.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;
}
在multipartFiles
参数后面依次添加实体类里面的每一个属性值即可
如下图:
@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;
}
注意事项: 文件的上传key
需要选择File
格式,同时参数名应该与后端代码约定的保持一致,
对象依旧是把对象的每个属性单独作为参数
相信有了2.4这个案例, 项目中上传文件需求的任何场景应该都能够满足了
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦