请教达人,关于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协议传上去之后才进行处理,谢谢两位大哥了。再次感谢!

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

使用Commons-FileUpload自己搞,控制权全部在自己

[url]http://www.iteye.com/topic/212566[/url]

直接使用Commons-FileUpload来做,文件上传到一个Servlet中,通过Commons-FileUpload的API可以直接在消息头中搞到文件长度,不需要等文件上传完成,控制权在你了就

7G?32位的操作系统根本不能读写的。最大4g,即便4g肯定也是没反应。

肯定是没反应的,struts要等到文件通过http协议传上去了之后才反应,这么大的文件,传不上去呀。这个时候应该用ftp+多线程+断点续传,或者点对点传输。

[quote]7G?32位的操作系统根本不能读写的。最大4g,即便4g肯定也是没反应。[/quote]
貌似NTFS文件系统支持大于4G的,FAT32不行

如果java的话,NIO的FileChannel可能可以读写,其他的一次读入内存的就不行了,因为寻址空间只有4G。

你可以上传一个小文件,然后用firefox+firebug网络监控看到http的内容。其实很明显,http协议是无状态的,不可能采用异步方式或者两次(一次传大小,第二次传内容)传输。

[quote]谢谢cats_tiger,不过struts要等到文件通过http协议传上去了之后才反应,从何证实呢?[/quote]
可以这样,直接把请求提交到一个servlet上,然后从doPost()方法中通过request打印消息头,看看是立即打印还是等老半天才打印,如果立即打印说明http消息头到了就会响应