项目部署到服务器后,上传文件出现空指针异常(本地测试没问题)

前言:

项目上线,本地测试工作已经完美结束,不料,当部署到网络服务器时却出现 文件上传 空指针异常 吓了个半死,赶紧加班加点修复,但一直没找到问题所在。因为本地测试没有问题啊!!!

问题描述:

项目中有文件上传功能,本地测试没有问题,但正式部署后上传出现空指针异常(异常代码如下)。反复检测,代码没有问题。但服务器获取项目名为空。经过多次测试,发现,上传小文件(200kb以内)可以上传成功。

130行代码,应该是指的 theFileFileName 为空了

解决过程:

由于本地测试没有问题,小文件也可以上传成功,基本排除代码问题。联想到文件大小限制,tomcat和服务器本身都有类似的文件大小限制,查阅相关资料后,得出部分干货:

1、win 2008 r2 系统带有文件限制,默认为30M少一点 可修改

修改C:/Windows/System32/inetsrv/config/schema/IIS_schema.xml文件 defaultValue 属性单位是 B 

<element name="requestLimits">
           <attribute name="maxAllowedContentLength" type="uint" defaultValue="30000000" />
           <attribute name="maxUrl" type="uint" defaultValue="4096" />
          <attribute name="maxQueryString" type="uint" defaultValue="2048" />
          <element name="headerLimits">
          <collection addElement="add" clearElement="clear" removeElement="remove" >
             <attribute name="header" type="string" required="true" isUniqueKey="true" validationType="nonEmptyString" />
             <attribute name="sizeLimit" type="uint" required="true" />
          </collection>
      </element>

2、tomcat带有上传限制:

tomcat目录下的conf文件夹下,server.xml 文件中以下的位置中添加maxPostSize参数 单位 B

<Connector port="8080"  
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
               enableLookups="false" redirectPort="8443" acceptCount="100"  
               debug="0" connectionTimeout="20000"   
               disableUploadTimeout="true" URIEncoding="utf-8"  
               maxPostSize="30000000"/>  

注意: 1.实际项目中,一般会使用框架。一般项目都是在SpringMVC或Struts2(或其他框架)中设置

            2.实际部署后,因为带宽以及文件大小问题,往往需要再次修改 connectionTimeout="20000" 提高响应时间,配合使用

查阅到以上干货后,便开始动手测试,将服务器以及struts2中相关配置配置好后,将 connectionTimeout设置为 2000毫秒,模拟带宽低,文件大导致的超时情景,得到以下内容(确实连接超时)(此处为自己埋坑!!!)

在公司服务器上几次测试下来,完全没有找到 空指针 的消息。直接怀疑到是服务器中堡垒机有相关设置,再次折腾了半天。查阅资料,越来越坚信是正式服务器带宽低导致的。一狠心,直接上正式服务器操作测试。因为无法修改带宽,所以只能修改响应时间了。没想到还真的成功了。但公司服务器响应超时和正式服务器的不同,导致也是脑回路短路。几经分析,应该是堡垒机作怪,因为不是非常懂运维,所以无法深入研究 为什么响应超时会出现 空指针现象(还请高手不吝赐教),只能大概猜测:

文件上传有个 中转站 ,java读取到文件,其实文件就已经在这个中转站中,java只是把这中转站的文件搬运到我们指定的目录。所以此时如果带宽低,出现响应超时,也就是中转站没有存在该文件,Java在读取中转站内容时,自然是出现空指针了。

以上为本人猜测。特此也记录一下

结论:本地测试文件上传正常,但有堡垒机的正式服务器文件上传超过一定大小上传失败,并提示 空指针异常(基本是获取文件信息空指针)是因为带宽低,超出响应时间导致,与普通服务器提示 响应超时 不一样。解决办法是:1.提高带宽,2.提高响应超时时间。

小尾巴:有时候不要过分依赖测试环境,也不要过分相信测试结论,就如上面 响应超时情况,测试服务器是提示 响应超时,而堡垒机中的是 空指针,一开始便是认定了响应超时提示应该是 响应超时,所以才导致走了一大圈弯,测试环境不容易模拟的情景,要充分利用大脑分析直指问题根源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值