介绍
今天写了一个controller,里面有两个参数,包括一个对象和一个MultipartFile对象。如下:
@PostMapping("/upload")
public AjaxResult upload(@RequestBody UploadFileRequest uploadFileRequest, MultipartFile file) {
photoService.upload(uploadFileRequest, file);
return success();
}
此时,接收前端请求时,会报错
17:28:37.135 [http-nio-8080-exec-1] ERROR c.a.m.c.e.h.GlobalExceptionHandlerBak - [extraExceptionHandler,223] - Content type 'multipart/form-data;boundary=--------------------------247732641106874960457027;charset=UTF-8' not supported
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=--------------------------247732641106874960457027;charset=UTF-8' not supported
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:211)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:160)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:133)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146)
原因
前端在走接口上传文件的同时会将请求header的content-type设置为:multipart/form-data, 或者form表单提交的时候将enctype设置为"multipart/form-data" 。
后端收到请求时由于请求体有@RequestBody 注解标识,通常会用application/json, application/xml处理content-type,此时会报编码格式的问题。
解决方式
MultipartFile这样的multipart/form-data媒体类型优先级会高于application/json,而配置@RequestBody 感觉使用一个低优先级的handle一个高优先级的从而报错。所以在multipart/form-data媒体类型请求时将@RequestBody去掉就可以了。