今天在做Struts文件上传的过程中遇到了一些问题,下面就详细的记录一下
先说一下我想达到的目的,就是在程序中可以控制用户上传文件的大小,如果用户文件的大小超过了配置的大小就给用户返回错误提示信息。最开始的时候我想到的方法是通过FormFile.getFileSize()方法来判断文件的大小是否超标,如果超标,就想用户返回错误信息。但是这种方法的最大问题就是用户的文件已经上传到服务器并且保存在内存中了,万一用户上传了一个1000M的文件怎么办,服务器还不直接挂了。
后来参照struts的文档,配置了文件的大小(<controller maxfilesize="1K"></controller>),这样在上传的过程中,如果文件超过了配置的大小,就会终止文件的上传。相应的FormFile字段为null,我们无法简单的通过判断FormFile是否为空来用户的文件是否超过了配置的大小,不过struts为我们提供了一个途径,在文件超过配置大小时struts会在Servelet Request设置一个属性, MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED,它的值是一个Boolean类型的变量,所以我们可以在Action的execute方法中通过如下代码判断文件是否”超标“:
Boolean maxLengthExceeded = (Boolean) request.getAttribute(
MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED);
if ((maxLengthExceeded != null) && (maxLengthExceeded.booleanValue()))
{
Blar, Blar...
}
到此好像事情已经解决了,但是我遇到了另外一个问题:
我所有Action都是继承自DispatchAction,parameter配置的名称是action。如果我上传的文件没有超过大小,一切OK,程序运行正常,struts根据我设定的action值调用了相应的方法。但是如果我上传了一个比较大的文件,struts就报错说action的值没有设置。不会吧,老大,我明明设置了值,怎么说没有设置呢?有没有搞错,大哥??
到网上找了找也没有相关的文章,没有办法,只用硬着头皮看代码。原来sturts在处理文件上传过程中如果文件的大小超过了配置的大小,那么它就不会对Form中的属性设值,说白了就是Form中的字段都是初始状态,所以action没有设值也就属于正常了。
为了解决这个问题,我把判断文件是否超标的代码放到了Form的validate方法,如果超标就直接返回input页面。但是问题又出现了,在validate返回ActionErrors对象后,页面应该自动返回到input页面,但是我在调试过程中页面怎么也无法返回到input,返回的总是一个空白页面,不光是这一个action出了问题,所有其他返回mapping.getInputForward()的action都不能正常返回了。怎么办?凉拌?看代码呀!
原来<controller maxfilesize="1K"></controller>(<controller maxFileSize="1K">还有一个参数inputForward,其默认值是true,看着字面的意思是如果文件超过了maxFileSize就跳转到input代表的页面。其实不然,它的意思是根据提交页面的url到action的forwards里边找一个名称是url的forward,然后返回这个forward代表的页面。不知道说清楚了没有,大家可以看下面的一个例子
比如我从/input/input.jsp上传一个超标的大文件到actionA,那么struts在validate错误后就会查找actionA的名称叫做/input/input.jsp的actionforward并返回,所以如果我配置了<forward name="/input/input.jsp" path="/input/input.jsp"/>,那么页面的返回就是正常的。知道了inputForward的意思解决方案就简单了,直接inputForward=false就OK了,如下:
<controller maxFileSize="1K" inputForward="false" />
分享到:
相关推荐
struts文件上传大小限制问题struts文件上传大小限制问题struts文件上传大小限制问题struts文件上传大小限制问题
JavaEE Struts文件上传
Struts1文件上传、单文件、多文件上传(上传文件大小问题,如何设置无限制)
struts2文件上传,文件大小设置,拦截器配置,移动性好
注:项目类无struts2 jar包需自行添加。 struts2上传文件的进度条显示,...2.显示已上传文件大小 3.显示当前进度(百分比控制) 4.显示剩余上传时间 5.显示当前速度 (本人研究了很久才搞出来的,希望大家指教)
Struts2 上传文件 过滤文件类型 过滤大小
struts文件上传大小限制,对大小进行限制以及常见错误
struts+spring文件上传大小限制 所以不设资源分,可以自由下载
用struts2实现的文件上传,带文件类型验证,大小限制,都是可以配置的,具体看你怎么配置了!
struts2文件的上传与下载,包含超出指定文件大小之后的提示。更多详细内容,请参考博客:http://blog.csdn.net/qq_20889581/article/details/52838848
下载word文档和代码,你就一定能够解决此问题。 解决Struts2上传文件后文件大小变大
基于struts2的文件上传+过滤器 可以动态的控制文件的类型和文件大小
Struts2 文件上传下载 多文件 单文件 实例;支持单个或多个文件的上传下载,并且自定义上传文件的大小和类型!!!
NULL 博文链接:https://yongjie.iteye.com/blog/792673
用struts2实现上传控制上传文件类型、大小以及多文件上传
用struts实现文件的上传和下载,在实现中,对于文件大小大于3M的进行限定.(注意版本问题)
使用struts2框架进行文件的上传并限制文件的大小与类型,使用struts2框架实现文件下载
struts1.2上传图片源代码(包含检查文件格式、限制文件大小功能); 已经做成成品,成功运行于项目之中
一个struts 2实现文件上传实例,上传文件类型、大小、路径都在 xml里面配置。