SpringBoot 接受文件和对象
使用场景:某个接口,需要同时接受文件和实体,也就是参数
一、这个时候,前端就不能`json`格式传送数据了,要用到`multipart/form-data;`这种格式传送数据。
二、那么,这个时候,后端应该怎样接受这个参数和文件呢?
1.接受`HttpServletRequest`,自己处理request(不推荐)
2.接受实体,将文件放到对象属性中(推荐)
3.接受参数,将文件放到接受参数中
这种方法适合接受单个文件参数,多参数还是建议用对象接受,方便扩展
4.一个坑,使用第二种方法的时候,一定不要加`@RequestBody `,加了这个注解,就会报如下错误。
所以,接受文件,不要使用`@RequestBody `注解。但是`@Validated`注解(校验参数的注解)是可以使用的。
一、这个时候,前端就不能json格式传送数据了,要用到multipart/form-data;这种格式传送数据。
二、那么,这个时候,后端应该怎样接受这个参数和文件呢?
1.接受HttpServletRequest,自己处理request(不推荐)
@PostMapping(value = "/upload")
@ResponseBody
public String handleFileUpload(HttpServletRequest request) {
MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);
// 获取文件
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
// 获取参数
String name=params.getParameter("name");
2.接受实体,将文件放到对象属性中(推荐)
在这里不能加@RequestBody 或@RequestParam,目前暂不清楚原因。
public class UserFileReq {
// 参数
private String username;
// 文件
private MultipartFile file;
// 省略get\set
}
@PostMapping(value = "/upload")
@ResponseBody
public String handleFileUpload(UserFileReq req) {
// 文件和参数 都在实体中了
}
3.接受参数,将文件放到接受参数中
这种方法适合接受单个文件参数,多参数还是建议用对象接受,方便扩展
@PostMapping(value = "/upload")
@ResponseBody
public String handleFileUpload(MultipartFile file) {
}
4.一个坑,使用第二种方法的时候,一定不要加@RequestBody,加了这个注解,就会报如下错误。
{
"timestamp": 1571196217195,
"status": 415,
"error": "Unsupported Media Type",
"exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
"message": "Content type 'multipart/form-data;boundary=2gOOYeFBpE;charset=UTF-8' not supported",
"path": "/file/upload"
}
所以,接受文件,不要使用@RequestBody注解
但是@Validated注解(校验参数的注解)是可以使用的。
————————————————
版权声明:本文为CSDN博主「LitongZero」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LitongZero/article/details/102583161