项目中需要上传一些较大的文件,都是一些压缩备份文件,动不动就几百M。系统框架SSH,必然用Struts。而Struts提供了 FormFile类来上传文件。起初一切正常,上传下载的都没问题,但过了一段时间后客户提出大于300M的文件上传不上去。测试后发现果真如此,但是后台并不报错,直接返回下面的forward了。因为是初次使用,下面就是我一小天行走的过程。
起初,我开始到处搜寻网上的上传文件下载,很多人用的都是apache得commons-fileupload.jar这个组件,而且代码都贴出了,我随便下了一个小demo,屡试不爽,别说300,500M也能传上去,而且也用了Struts,我开始犯晕。我试着将我的环境与demo得环境代码尽量相似,至少主要代码应该差不多。我将目前系统中的上传附件代码改成了demo中的:
DiskFileUpload upload = new DiskFileUpload();
List uploadList = upload.parseRequest(request);
但是每次使用uploadList.size();时获取到得都是0,根本传布了。我更晕了。。。
我再次仔细的对比demo和系统,最后发现demo中没有使用Struts的FormBean,会不会是这里的问题?于是我将demo中也增加了 FormBean类,标签都用上了Struts的标签,这次果然demo也失效了。。。终于被我发现,都是FormBean的问题,但现在我又不可能舍弃 FormBean,因为不仅仅是附件,还有别的很重要的一些属性,代码都写好了,不可能大范围修改,那咋办?
为什么fileupload可以传那么大,而你struts却传不上大于300M的文件?再次搜索,终于发现原因,Struts在写 FormFile类时借助的是fileupload中的API,设置的默认大小为250M,难怪传不上去!如何设置更大一些或更小一些呢?这样:
在Struts配置文件的mapping标签后加上
<controller maxFileSize="1024M" />
看到这个小标签页不用解释什么了吧!我设置了1G,现在传只要小于1G的附件都没问题了!