1. 复现问题
今天在做上传文件的功能,后端代码如下所示:
/**
* @author 念兮为美
* @datetime 2022/12/8 16:12
* @desc 文件控制器
*/
@Api(tags = "文件模块")
@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {
@Autowired private FileService fileService;
@Autowired private JwtTokenProvider jwtTokenProvider;
@ApiOperationSupport(author = "念兮为美")
@ApiOperation(value = "文件上传")
@PostMapping("/upload")
@LogAnnotation
public ReturnResult upload(
@RequestHeader(value = REQUEST_HEADER_TOKEN) String token,
@Validated @RequestBody UploadDto uploadDto,
BindingResult bindingResult) {
BindingParamUtil.checkParam(bindingResult);
TokenProperties tokenProperties = jwtTokenProvider.parseToken(token);
ReturnResult upload = fileService.upload(uploadDto, tokenProperties);
return upload;
}
}
但使用postman
测试时,却报出如下错误:
后端报出的具体错误信息如下所示:
即Content type 'multipart/form-data;boundary=--------------------------036764477110441760467042;charset=UTF-8' not supported
的错误。
2. 分析问题
将上述错误信息翻译成中文不支持'multipart/form-data;boundary=--------------------------036764477110441760467042;charset=UTF-8'请求类型
。
为什么不支持这种类型呢?
原来我们在上传文件时,spring
框架会自动装配文件类型,使用@RequestBody
接收对象,所对应的content-type :application/json
。所以当使用@RequestBody
和文件上传的时候,会报错。
3. 解决问题
有以下两种解决方案:
- 删除
@RequestBody
注解
既然在上传文件时,不能使用@RequestBody
,那就删除@RequestBody
注解,如下代码所示:
@ApiOperationSupport(author = "念兮为美")
@ApiOperation(value = "文件上传")
@PostMapping("/upload")
@LogAnnotation
public ReturnResult upload(
@RequestHeader(value = REQUEST_HEADER_TOKEN) String token,
@Validated UploadDto uploadDto,
BindingResult bindingResult) {
BindingParamUtil.checkParam(bindingResult);
TokenProperties tokenProperties = jwtTokenProvider.parseToken(token);
ReturnResult upload = fileService.upload(uploadDto, tokenProperties);
return upload;
}
删除@RequestBody
注解之后,能够正确地上传文件了。
- 使用
@RequestParam
注解
使用@RequestParam
注解替换掉@RequestBody
注解,如下代码所示:
@ApiOperationSupport(author = "念兮为美")
@ApiOperation(value = "文件上传")
@PostMapping("/upload")
@LogAnnotation
public ReturnResult upload(
@RequestHeader(value = REQUEST_HEADER_TOKEN) String token,
@RequestParam("file") MultipartFile file,
@RequestParam("fileType") String fileType) {
TokenProperties tokenProperties = jwtTokenProvider.parseToken(token);
UploadDto uploadDto = new UploadDto(file, fileType);
ReturnResult upload = fileService.upload(uploadDto, tokenProperties);
return upload;
}
以上两种解决方案,都重新使用postman测试后,能够正常上传图片,如下图所示: