一个栗子
@PostMapping("add")
public RspMsg add(@RequestParam Map<String,Object> param,HttpServletRequest request, @RequestHeader("userNo")String userNo){
log.info("---->开始添加案件,{}",param);
RspMsg rspMsg=new RspMsg();
MultipartFile multipartFile = null;
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart){
MultipartHttpServletRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class);
multipartFile = multipartRequest.getFile("file");
}
try {
rspMsg=caseManageSer.add(param,userNo,multipartFile);
} catch (Exception e) {
log.error("添加案件异常",e);
rspMsg.setFailMsg("添加失败");
}
log.info("添加案件结束<----",rspMsg);
return rspMsg;
}
我们知道,如果不用HttpServletRequest来接收multipartFile的话,必须用@RequestParam(“file”) MulitpartFile file来指明有mulitpartFile文件,不然是不会接收到文件的.
我们可以这样理解,如果是form表单形式传输,需要把Content-Type
的mulitpart/from-data
,注意了这/
,他使用这个分开,说明,普通的data和mulipart是分开来传输的,虽然说他们都是统一的格式,所以我们获取也需要分开来获取(个人理解)。
然后,还遇到了一个坑,就是一般用@RequestParam,就是将数据放在了表单中,如果按照HTTP标准规定的话,一般get请求,才会将数据放在form表单中(注意了,这里我用的chrom内核的浏览器,别的浏览器我不能保证,POST请求也能获取到表单中的数据),所以一开始我也使用的GET请求,但是到了这一行判断,他返回的是false,这也就意味着系统认为我们的请求是不含mulipart数据的???
if (isMultipart)
我们查看他的源码:
public static final boolean isMultipartContent(
HttpServletRequest request) {
if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) {
return false;
}
return FileUploadBase.isMultipartContent(new ServletRequestContext(request));
}
真相大白了!如果不是POST请求,直接返回false。
所以改成POST请求,运行成功!
另外说一句,springboot的前世还是springMVC,所以他是集大成者,借鉴了很多springMVC的东西,感觉还是有些糟粕的,希望能越来越完善!