记录一下在原有的接口中增加文件上传☞@RequestPart
首先,咱声明一下:
@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接收再对应封装之类的其他方法。