我遇到的问题是:
在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协议传上去之后才进行处理,谢谢两位大哥了。再次感谢!