brilliant2012 2008-11-11 14:07
浏览 214
已采纳

请教达人,关于Struts 1中的上传控制的一个问题

我遇到的问题是:
在Controller中配置了maxFileSize="5M" 后,如果上传稍大于5M的文件,比如几十兆的,则会很快响应出错误信息,但是如果传一个7G的文件,则页面基本没有响应了。

看struts源码,FileUploadBase.java中,从(RequestContext)new ServletRequestContext(request)中,取得了getContentLength(),一个int值,拿这个值与配置的sizeMax进行比较,如果大于配置的值的话,则抛出异常,该异常在CommonsMultipartRequestHandler.java中被捕获,而且设置了 request.setAttribute(MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED,Boolean.TRUE);
这样前台就可以根据刚设置的这个变量的值来处理错误信息了。

我现在不明白的是,为什么传一个太大的,比如7G的文件,页面为什么没有响应了,ContentLength是什么时候被Servlet自动设置的?而且Struts中的这种判断是不是也相当于等文件流传完了之后才会得知文件的大小超出限制的?

[b]问题补充:[/b]
我遇到的问题是:
在Controller中配置了maxFileSize="5M" 后,如果上传稍大于5M的文件,比如几十兆的,则会很快响应出错误信息,但是如果传一个7G的文件,则页面基本没有响应了。

看struts源码,FileUploadBase.java中,从(RequestContext)new ServletRequestContext(request)中,取得了getContentLength(),一个int值,拿这个值与配置的sizeMax进行比较,如果大于配置的值的话,则抛出异常,该异常在CommonsMultipartRequestHandler.java中被捕获,而且设置了 request.setAttribute(MultipartRequestHandler.ATTRIBUTE_MAX_LENGTH_EXCEEDED,Boolean.TRUE);
这样前台就可以根据刚设置的这个变量的值来处理错误信息了。

我现在不明白的是,为什么传一个太大的,比如7G的文件,页面为什么没有响应了,ContentLength是什么时候被Servlet自动设置的?而且Struts中的这种判断是不是也相当于等文件流传完了之后才会得知文件的大小超出限制的?

补充:
二楼,那篇文章我已经看过了,他那只是捕获更多的exception方便前台处理,并没有涉及到struts上传判断的机制问题啊。
[b]问题补充:[/b]
谢谢2楼,但是Struts 本身默认就是用Commons-FileUpload中的FileUploadBase.java从消息头里面得到的Content-Length,然后与其设置进行比较。我现在不明白的是:当程序走到“从消息头里面得到Content-Length,并且与配置的大小进行比较”这一步时,文件怎么样了?是已经上传了吗?如果不是,那为什么我上传一个7G的文件,页面就不动了呢?Content-length是什么时候设置到请求头里面去的?
[b]问题补充:[/b]
现在我上传一个2.5G的也没有反应
[b]问题补充:[/b]
谢谢cats_tiger,不过struts要等到文件通过http协议传上去了之后才反应,从何证实呢?
[b]问题补充:[/b]
证实了,确实先通过http协议传上去之后才进行处理,谢谢两位大哥了。再次感谢!

  • 写回答

10条回答 默认 最新

  • iteye_521 2008-11-11 14:57
    关注

    Content-Length是放到了HTTP消息头中,文件是放到了消息体中,你完全可以刚拿到消息头的时候如果太大就抛异常,
    BT:我知道Struts1中内置的文件上传是用Commons-FileUpload做的,不过说句实话,不怎么样,Commons-FileUpload版本太低,连个回调函数都不支持,要是搞ajax动态显示上传进度,够费劲的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号