今天练习Struts2是时,发现了一个有趣的现象:Struts2上传后的文件,跟原文件有出入,变大了。
无论是图片文件还是文本文件都是这样。我特地对文本文件进行了对比,发现上传后的文件有重复的字符。并且俺对前后两个文件的属性进行了查看对比。发现原文件和上传后文件的属性很有意思,如下:
原文件
上传后文件
那这个到底是框架上传文件时自身问题,还是我们在保存文件时有问题呢,我特地打印了框架上传后的临时文件大小,发现跟原文件一样仍是:3175.
那问题就出在保存文件这一关了,我的代码是这样的。
InputStream fis = new FileInputStream(file);
OutputStream fos = new FileOutputStream(filePath);
byte[] bs = new byte[2*1024];
int i ;
while ((i = fis.read(bs)) > 0) {
fos.write(bs);
}
fis.close();
fos.flush();
fos.close();
问题会在哪里呢,后来发现问题在
fos.write(bs);
将其改成:
fos.write(bs, 0, i);
上传前后文件就一致了。
问题应该是缓存数组处理的问题了,看来流的那些方法不是无用的,不能偷懒。
注:最好配置上Struts2的cleanup过滤器
<!-- Struts Cleanup Filter -->
<filter>
<filter-name>struts2-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>