以前遇到的坑,现在又用到了。为了避免大家入坑,所以有为大家发出来共享。
项目一用到了上传,在Spring配置文件中并没对multipartResolver进行配置,后台接口获取文件的方法为:
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");
首先将request请求的上下文转换为MultipartResolver,然后转换为MultipartHttpServletRequest请求,通过multipartRequest请求就可以获取对应的file文件信息,这样的方法没有问题,后台能获取到相应的文件参数。
项目二也用到上传,基于网上查的资料,认为应该把下面Spring的配置文件给加上去了,于是问题出来了:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- set the max upload size100MB -->
<property name="maxUploadSize">
<value>10485760000</value>
</property>
<property name="maxInMemorySize">
<value>4096</value>
</property>
</bean>
配置完成后,调用与项目一相同的接口获取文件,获取到file为空,造成了上传错误。按道理spring的上传应该需要这样的配置,但是反而造成了bug,线下环境测试时将该配置去除后功能就可以了。
搜了资料,做了测试,有了以下解决方案!
(一)在Spring配置文件中配置了<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 之后。使用下面方法即可MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request; MultipartFile file = multiRequest.getFile("file");
原理是:使用 spring 的 CommosMultipartResolver 配置 MultipartResolver 用于文件上传,DispatcherServlet 将调用 MultipartResolver 的 isMultipart(request) 方法检查当前 Web 请求是否为 multipart 类型,如果是则 DispatcherServlet 将调用 MultipartResolver 的 resolveMultipart(request) 方法,对原始的 request 进行装饰,并返回一个 MultipartHttpServletRequest 供后继流程使用 (最初的 HttpServletRequest 被偷梁换柱成了 MultipartHttpServletRequest);否则,会直接返回最初的 HttpServletRequest。也就是说请求一旦被 MultipartResolver 接手,它就会解析请求中的文件,而不必等待后续 controller 主动从 MultipartRequest 中 getFile("file"),所以在配置了 MultipartResolver 后,再通过项目一这样的方法
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
是获取不到file的,因为控制器已经帮我们进行了转换,我们直接获取即可。
(二)没有进行Spring配置文件的配置,直接在后台获取 MultipartResolver 进行转换即可,也就是项目一接口的写法。
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");