?? ? 问题描述:
?? ? ? ?公司平台中的附件组件,部署在Tomcat下上传、下载均没有问题,等到将代码部署到weblogic中时,下载附件时有时候会出现java.net.ProtocolException,有时候附件可正常下载。
?? ? ? 问题分析:
在异常信息中提示响应头中的Content-Length 与实际传输的字节长度不一致。但有的附件却可以正常下载,因此,问题应该出在响应输出流的字节数与Content-Length中设置的大小不一致。但有的附件却可以正常下载,也就是说有一些附件的实际输出字节数与Content-Length中的一致。
?? ? ? ?相同的问题曾经出现在我编写的MD5工具中,即我自己编写的工具根据文件生成的MD5值与其他工具生成的不一致,造成原因是我更新MD5时没有根据实际读入的字节数组长度,而是以缓存的字节数组固定长度进行更新的,因此问题就出现在了缓存数组的大小与实际读入(写出)的字节长度不一致,下面用代码进行说明:
?? ?错误代码:
?
byte bufferArray[]=new byte[10240]; if(fis!=null) { while(fis.read(bufferArray)!=-1) { fos.write(bufferArray); } }
?
?? 上面的代码没有根据实际读入的大小进行输出,因此在输出时,由于读入的文件大小不是缓存数据大小的整数倍,就会造成实际输出的字节长度大于文件的实际长度,与相应头中设置的Content-Length不一致,下载报错。
?? ?但如果附件的长度恰恰是缓存数组长度的整数倍,则实际输出长度与Content-Length一致,下载不会报错。
?? ?至于Tomcat下没有问题而Weblogic下有问题,应该是weblogic对相应的校验比Tomcat严格所致。
?? ? ?问题解决:
?? ? ? 在输出时按照实际读入的字节数组长度进行输出,问题解决。
?? ? ? 具体代码:
?? ? ??
byte bufferArray[]=new byte[10240]; if(fis!=null) { int byteLength=fis.read(bufferArray); while(byteLength!=-1) { fos.write(bufferArray,0,byteLength); byteLength=fis.read(bufferArray); } }?