文件上传中Spring配置对MultipartResolver和MultipartHttpServletRequest两种方法的影响

以前遇到的坑,现在又用到了。为了避免大家入坑,所以有为大家发出来共享。

项目一用到了上传,在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");

原文地址: 
http://www.cnblogs.com/yskcoder/p/4718198.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值