项目背景:springboot 项目遇到一个需求,需要上传多个文件及相关参数信息。
工具请求方式:Body里面设置:multipart/form-data

最开始按下面方法定义
/**
* 上传文件(新)
*
* @param fileUploadReq 附件关联信息
* @return 结果
*/
@PostMapping(value = "/file/upload/new", consumes =
MediaType.MULTIPART_FORM_DATA_VALUE)
public R<FileRecord> uploadNew(@RequestBody FileUploadReq fileUploadReq);
会出下面的错误
Content type 'multipart/form-data;boundary=--------------------------789428842947670377098484;charset=UTF-8' not supported

解决方法:
- 从HttpServletRequest中提取参数
/**
* 文件上传请求
*/
@PostMapping("/upload/new")
public R<FileRecord> uploadNew(HttpServletRequest request) {
try {
MultipartHttpServletRequest params=((MultipartHttpServletRequest) request);
List<MultipartFile> files = ((MultipartHttpServletRequest) request)
.getFiles("fileList");
String relationId = params.getParameter("relationId");
String relationType = params.getParameter("relationType");
// 上传并返回访问地址
// TODO
return R.ok(new FileRecord());
} catch (Exception e) {
log.error("上传文件失败", e);
return R.fail(e.getMessage());
}
}
- 直接用实体接收
/**
* 文件上传请求
*/
@PostMapping("/upload/new")
public R<List<FileRecord>> uploadNew(FileUploadReq fileUploadReq) {
try {
// 上传并返回访问地址
List<FileRecord> fileRecord = sysFileService.uploadFileNew(fileUploadReq);
return R.ok(fileRecord);
} catch (Exception e) {
log.error("上传文件失败", e);
return R.fail(e.getMessage());
}
}
注意:该处不可以用 @RequestBody 注解接收,文件类型请求只能用@RequestPart及@RequestParam注解接收。例如:
- RequestParam
@PostMapping("/problem")
public AjaxResult problemReport(@RequestParam("file") List<MultipartFile> files,
MaterialTaskProblemReportAddReq problemReportAddReq) {
reportManager.problemReport(files, problemReportAddReq);
return AjaxResult.success("新增成功");
}
虽然这样可以接收到,但这样写即不好理解参数(与请求参数格式不对应),又不简洁。