首先,咱声明一下:
@RequestBody和 MultipartFile 不可以 同时使用!!!
因为这两者预期的请求内容类型不同。@RequestBody
预期请求的 Content-Type
是 application/json
或 application/xml
,而 MultipartFile
预期的是 multipart/form-data
。
现在的场景是这样的:
1. 一种是既有其他字段,又有文件上传;
2. 另一种是需求原来没有文件上传,我们用 @RequestBody 接收入参,后来需求改了,在原有的表单中增加了上传文件。这种情况下怎么弄呢?
解决方法:
第一种,直接用 @RequestParam 逐个接收对应的字段:
@PostMapping("/add")public ResponseVO add( @RequestParam(required = false) Integer idBiz,@RequestParam Integer idConnLink,@RequestParam String idPlatform,@RequestParam Date approveTime,@RequestParam String approveNo,@RequestParam(required = false) MultipartFile approveMaterial,@RequestParam Date registerTime,@RequestParam(required = false) MultipartFile topologyMap,@RequestParam(required = false) Long deviceId) throws IOException {......
}
第二种,@RequestPart可以同时处理普通参数和Multipart文件,允许在一个方法中处理多种类型的参数。所以用它来接收JSON和FILE 简直是再合适不过了。
/*** 新增/更新* @param bo* @return* @throws BaseException*/@RequestMapping(value = "/update", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)public ResponseVO update(@RequestPart("bo") BusinessBaseInfoBO bo, @RequestPart(value = "file", required = false) MultipartFile file) throws BaseException, SQLException, IOException {if(file != null){String approveMaterialLast =file.getOriginalFilename();file.transferTo(new File(url+"/001/"+approveMaterialLast));bo.setApproveMaterials(file.getOriginalFilename());}......return new ResponseVO<>().success();}
在Apifox中自测的时候,需要注意Content-Type的选择:
当然除了上面常用的,还可以用Map接收再对应封装之类的其他方法。