附件上传解析空指针异常

这两天在用spring进行上传上遇到问题,本地测试可以,服务器的就是不行,后来看了一下一个配置文件和我的不一样,有一个配置上传大小的原因导致的。

我并没有在spring的配置文件进行multipartResolver的配置,后台的java的获取为:

MultipartFile file = null ;
String filename="";
MultipartResolver cmr = new CommonsMultipartResolver(request.getSession().getServletContext());
if(cmr.isMultipart(request)){
          //将request转换成多分解请求
         MultipartHttpServletRequest mhs = cmr.resolveMultipart(request);
         //根据input中存在的name来获取是否存在上传文件
          file = mhs.getFile("file");
          filename = file.getOriginalFilename();
  }

将request请求的上下文转换为MultipartResolver,然后转换为MultipartHttpServletRequest请求,通过MultipartFile请求就可以获取对应的file文件信息,这样的方法没有问题,后台能获取到相应的参数;

后面组里另一个同事也用到上传,基于网上查的资料,认为应该设置一下文件上传大小,然后加了配置文件,于是问题出来了,也造成了我记录该博客的原因:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
   
   <property name="maxUploadSize"> 
   <value>10485760000</value> 
   </property> 
   <property name="maxInMemorySize"> 
   <value>4096</value> 
   </property> 
</bean>

进行该配置后,我在后台的该方法获取file为空造成了上传错误,刚开始我也纳闷,按道理spring的上传应该需要这样的配置,同事也是觉得应该限制一下文件上传大小,但是反而造成了bug,线下环境测试将该配置去除功能ok。但是不能因为bug而不进行原理的问题查看,然后去搜资料。

(一)在spring-config配置了<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 之后

后台的获取有两种方法:

1、指定@RequestParam MultipartFile file 例如:public Map<String, Object> uploadExcel(@RequestParam MultipartFile file,@RequestParam(value="key") String key)参数;

2、将request转化为MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)(request);

原理是:使用spring的CommosMultipartResolver 配置MultipartResolver 用于文件上传,DispatcherServlet 将调用 MultipartResolver 的 isMultipart(request) 方法检查当前 Web 请求是否为 multipart类型。如果是,DispatcherServlet 将调用 MultipartResolver 的 resolveMultipart(request) 方法,对原始 request 进行装饰,并返回一个 MultipartHttpServletRequest 供后继处理流程使用(最初的 HttpServletRequest 被偷梁换柱成了 MultipartHttpServletRequest),否则,直接返回最初的 HttpServletRequest。也就是说请求一旦被 MultipartResolver 接手,它就会解析请求中的文件,而不必等待后续 controller 主动从 MultipartRequest 中 getFile,所以在配置了MultipartResolver后,再通过这样的方法

MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);

是获取不到file的,因为控制器已经帮我们进行了转换 直接获取即可。

如果你使用该方法发觉获取没有问题,你可以看看给这个方法是不是配置了servlet,如果配置了servlet是不走这个 MultipartResolver控制,是能获取成功的。

(二)无需进行spring-config的配置,直接在后台获取进行转换即可,也就是我最初的写法。我们平台解析方法是这样的,上传大小有自己的处理逻辑。下面是用到的逻辑

MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
MultipartFile file = multipartRequest.getFile("file");
//获取文件大小,后面做判断
long size=file.getSize()
//判断文件大小等处理文件等代码
//.....

然后项目具体需要什么样的修改,自己结合业务斟酌即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值