论坛首页 入门技术论坛

Struts 上传文件大小的控制

浏览 10490 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-08-17  

今天在做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" />

   发表时间:2007-08-17  
我下面的东西到哪去了,写了半天,怎么都没了
0 请登录后投票
   发表时间:2007-08-17  
大哥  什么东西啊!  不懂呢
0 请登录后投票
   发表时间:2008-03-27  
大哥,精彩,怎么没下文了
0 请登录后投票
   发表时间:2008-04-14  
麻烦继续补上,谢谢
0 请登录后投票
   发表时间:2008-04-19  
请问下楼主可以用filter来判断不?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics