项目背景: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("新增成功"); }
虽然这样可以接收到,但这样写即不好理解参数(与请求参数格式不对应),又不简洁。