SpringBoot 接受文件和对象
使用场景:某个接口,需要同时接受文件和实体,也就是参数
一、这个时候,前端就不能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.接受实体,将文件放到对象属性中(推荐)
public class UserFileReq {
private String username;
private MultipartFile file;
}
@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
注解(校验参数的注解)是可以使用的。