Spring Boot通过Request获取上传文件的方法
2018-04-20 本文已影响0人
李北北
这两天在做文件上传功能,我希望通过request对象拿到所有上传的文件对象集合。
下面是两种根据百度来的方式,但是都没有达到目的。
方式一
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = mRequest.getFileMap();
说明:将HttpServletRequest对象强制转换为MultipartHttpServletRequest 对象,可是报出RequestFacade cannot be cast to ltipart.MultipartHttpServletRequest异常
方式二
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(this.getRequest());
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
说明:该方式在正确引入下面的jar包后,没有出现异常,但是得到的map集合为空,就是说没有正确拿到上传的文件对象集合
<!-- 文件上传工具 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
分析
参考别人的方法去 debug调试了一下 DispatcherServlet 的 checkMultipart(HttpServletRequest request)这个方法,发现它执行this.multipartResolver.resolveMultipart(request);这行时候,multipartResolver对象是StandardServletMultipartResolver类型的,再结合上面的方式二,将CommonsMultipartResolver类改成了StandardServletMultipartResolver类(注:这两个类都实现了MultipartResolver接口),最终代码如下:
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
MultipartResolver resolver = new StandardServletMultipartResolver();
MultipartHttpServletRequest mRequest = resolver.resolveMultipart(request);
Map<String, MultipartFile> fileMap = mRequest.getFileMap();
然后测试果然成功拿到了文件对象,至于后续要对文件对象做什么操作就很方便了。
这里需要说明的是,通过MultipartHttpServletRequest拿到的map对象中的key就是我们前端界面中 input 标签的名称,因此这里可以做点什么从而实现任意数量文件上传并且能够得到处理后的结果,比如说多图上传到七牛云之后,可以将得到的路径存入对应的字段中。