客户说,上传文件的时候出了问题。说无法上传某些文件,说是抛java.io.IOException: Corrupt GZIP trailer异常,但并不是所有文件都会抛异常。仅限于某几个文件(脑烂了~),客户还把“有问题”的文件发了过来。一个叫testFile.bbc的文件,大小是97,663字节,还有一个叫 测试文件.bbd,大小是2,325,310字节。
BUG从天而降
上传文件这部分的测试是在Windows环境下做的。当时测试的时候也没遇到什么问题。可是客户说他们是在Unix系统下测试时出的问题,Windows系统一切正常(脑烂了~)。为了重现这个BUG,我们装了Solaris系统。并且安装了Eclipse和Weblogic的Solaris版本,将服务端工程载入Eclipse并启动。启动客户端的浏览器(Windows,IE6),上传文件,结果上传失败服务端抛出java.io.IOException: Corrupt GZIP trailer。这到底是为什么?
问题的描述
<script type="text/javascript"> google_ad_client="pub-6065469188450680"; google_ad_width=728; google_ad_height=90; google_ad_format="728x90_as"; google_ad_type="text_image"; google_ad_channel="6872543818"; </script>1.系统构成描述:
客户端是一个APPLET,该APPLET的功能是将用户指定的文件以.gz的形式压缩以后发送到服务端。
服务端是一个SERVLET,它的作用是将客户端发送过来的.gz文件解压出来,并存在服务器的某个目录中。
2.发送数据中的发送文件格式描述:
第一步:发送 --Boundary(这里的Boundary是一个时间标签,用来分割数据)回车换行
第二步:发送 Content-Disposition: form-data; name=uploadfile;filename=testFile.bbc回车换行
第三步:发送 Content-type:x-gzip回车换行
第四步:发送 回车换行
第五步:发送 .gz文件内容
第六步:发送 回车换行
第七步:发送 --Boundary--
3.客户端按照描述2所述的格式将数据发送到服务端。服务端按照该格式来解析数据,将数据中的文件内容部分抽出来并写入.gz文件中。
投机取巧
考虑到每次抛异常都是在读最后一次数据的时候,所以我们将原来每次读1024个字节,改为每次读1个Int,并且如果在读最后一个Int的时候抛出Corrupt GZIP trailer异常,我们就不理。没有了异常,表面上来看问题似乎已经解决了

















