一:首先看一下程序执行中出现的对应报错信息,如下所示:

  1. [WARN ] 2015-03-03 15:31:11 :Unable to parse request
  2. org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (78871114) exceeds the configured maximum (52428800)
  3. at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:937)
  4. at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)
  5. at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:351)
  6. at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parseRequest(JakartaMultiPartRequest.java:151)
  7. at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.processUpload(JakartaMultiPartRequest.java:90)
  8. at org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest.parse(JakartaMultiPartRequest.java:80)
  9. at org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper.<init>(MultiPartRequestWrapper.java:75)
  10. at org.apache.struts2.dispatcher.Dispatcher.wrapRequest(Dispatcher.java:740)
  11. at org.apache.struts2.dispatcher.ng.PrepareOperations.wrapRequest(PrepareOperations.java:131)
  12. at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:83)
  13. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  14. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  15. at com.frame.action.ChineseFilter.doFilter(ChineseFilter.java:66)
  16. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
  17. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  18. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
  19. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
  20. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
  21. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
  22. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
  23. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
  24. at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
  25. at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
  26. at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
  27. at java.lang.Thread.run(Thread.java:619)
  28. [WARN ] 2015-03-03 15:31:11 :Could not find token name in params.

类似的问题相信很多人都遇到过,也晓得如何解决,我这里记录下来也是为了让自己对这个问题理解的更好一点,当然,我下面记录的情况都是在我的机器上实际都试验了的,下面是我根据自己的实验以及网上的相关资料的小结。

二:限制Struts2文件上传的三种情况

1:Struts2对应的配置文件中的配置的限制

struts.multipart.maxSize=上传文件的最大值(单位是字节)这个配置是控制整个项目一次性上传的文件的最大值!如果实际上传的文件超过了此配置的大小那么就会报  org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (78871114) exceeds the configured maximum (52428800),这个异常信息!

这个配置有对应的默认值,如果不设置则使用默认的设置(针对我自己的项目这个默认配置的所在位置是:struts2-core-2.3.1.2.jar包中的org\apache\struts2\default.properties文件中)struts.multipart.maxSize=2097152,代表默认上传的文件最大值是2M,如果我们想修改它也是很容易的,有以下两种方式:

1)在struts.properties文件中配置,比如:struts.multipart.maxSize=52428800 (代表上传的文件的最大值是50M)

2)在struts.xml文件中配置,比如:<constant name="struts.multipart.maxSize" value="52428800"/>(也代表上传的文件的最大值是50M)

2:Struts2对应的文件上传的拦截器的限制

  1. <interceptor-ref name="fileUpload">
  2. <param name="maximumSize">52428800</param>
  3. </interceptor-ref>

这种方式是限制特定的Action的一种方式,当然她是在满足第一种情况下才起作用的,换言之,这里的配置要小于第一种情况的设置才能起到对应的作用!

需要注意的是,拦截器的使用以及和第一种文件上传之间的配合,情况如下(下面的代码仅仅是事例代码而已):

2-1:没有拦截器的情况,仅第一种限制起作用

  1. <action name="fileUpload" class="fileUploadAction" method="fileUpload">
  2. </action>

2-2:仅使用默认的拦截器的情况,和2-1的效果一样,它们两个的本质是一样的,因为Struts2会每个Action加入一个默认的拦截器,显示说明与否皆可!

  1. <action name="fileUpload" class="fileUploadAction" method="fileUpload">
  2. <interceptor-ref name="defaultStack"></interceptor-ref>
  3. </action>

2-3:仅使用文件上传的拦截器的情况,第一种限制起作用,第二种限制也有效果,不过这种使用拦截器的方式是有问题的,这里仅仅使用了文件上传的拦截器而已,导致数据信息的丢失!当实际上传的文件大于拦截器的配置的时候,会报([WARN ] 2015-03-03 18:49:44 :File too large: fileUploadModel.upload "test.png" "upload_6e4dba7d_14be260bb68__7fe3_00000018.tmp" 11185361)不过程序会继续的执行!

  1. <action name="fileUpload" class="fileUploadAction" method="fileUpload">
  2. <interceptor-ref name="fileUpload">
  3. <param name="maximumSize">10485760</param>
  4. </interceptor-ref>
  5. </action>

2-4:先使用文件上传的拦截器,再使用默认的拦截器的情况,第一种限制起作用,第二种限制也起作用,并且当实际上传的文件的大小超过拦截器的限制时,程序会报错([WARN ] 2015-03-03 18:53:30 :File too large: fileUploadModel.upload "test.png" "upload_53477faa_14bdea02616__7fef_00000008.tmp" 11185361)且程序会终止执行(调试的结果显示没有进入相应的Action类中)!

  1. <action name="fileUpload" class="fileUploadAction" method="fileUpload">
  2. <interceptor-ref name="fileUpload">
  3. <param name="maximumSize">10485760</param>
  4. </interceptor-ref>
  5. <interceptor-ref name="defaultStack"></interceptor-ref>
  6. </action>

2-5:先使用默认的拦截器,再使用文件上传的拦截器的情况,第一种限制起作用,第二种限制也起作用,不过当超过拦截器的限制时,程序会报错([WARN ] 2015-03-03 18:58:30 :File too large: fileUploadModel.upload "test.png" "upload_53477faa_14bdea02616__7fef_00000008.tmp" 11185361)不过仍继续的执行!

  1. <action name="fileUpload" class="fileUploadAction" method="fileUpload">
  2. <interceptor-ref name="defaultStack"></interceptor-ref>
  3. <interceptor-ref name="fileUpload">
  4. <param name="maximumSize">10485760</param>
  5. </interceptor-ref>
  6. </action>

 3:上传文件的最大限制

文件上传的最大值应<2G,无论前面两项配置的是多大,当实际上传的文件大小大于2G的时候就会出现如下图的情况:

针对这个情况,我还不明白是什么原因引起的,如果有清楚的请告知一下,非常感谢!

三:对应的源码的情况

第一种限制对应的关键性源码(位置:commons-fileupload-1.2.2.jar包下\org\apache\commons\fileupload\FileUploadBase.java)

  1. FileItemIteratorImpl(RequestContext ctx)
  2. throws FileUploadException, IOException
  3. {
  4. if (ctx == null) {
  5. throw new NullPointerException("ctx parameter");
  6. }
  7.  
  8. String contentType = ctx.getContentType();
  9. if ((null == contentType) || (!contentType.toLowerCase().startsWith("multipart/")))
  10. {
  11. throw new FileUploadBase.InvalidContentTypeException("the request doesn't contain a multipart/form-data or multipart/mixed stream, content type header is " + contentType);
  12. }
  13.  
  14. InputStream input = ctx.getInputStream();
  15.  
  16. if (FileUploadBase.this.sizeMax >= 0L) {
  17. int requestSize = ctx.getContentLength();
  18. if (requestSize == -1)
  19. input = new LimitedInputStream(input, FileUploadBase.this.sizeMax, FileUploadBase.this) { private final FileUploadBase val$this$0;
  20.  
  21. protected void raiseError(long pSizeMax, long pCount) throws IOException { FileUploadException ex = new FileUploadBase.SizeLimitExceededException("the request was rejected because its size (" + pCount + ") exceeds the configured maximum" + " (" + pSizeMax + ")", pCount, pSizeMax);
  22.  
  23. throw new FileUploadBase.FileUploadIOException(ex);
  24. }
  25. };
  26. //看这里
    else if ((FileUploadBase.this.sizeMax >= 0L) && (requestSize > FileUploadBase.this.sizeMax)) {
  27. throw new FileUploadBase.SizeLimitExceededException("the request was rejected because its size (" + requestSize + ") exceeds the configured maximum (" + FileUploadBase.this.sizeMax + ")", requestSize, FileUploadBase.this.sizeMax);
  28. }
  29.  
  30. }
  31.  
  32. String charEncoding = FileUploadBase.this.headerEncoding;
  33. if (charEncoding == null) {
  34. charEncoding = ctx.getCharacterEncoding();
  35. }
  36.  
  37. this.boundary = FileUploadBase.this.getBoundary(contentType);
  38. if (this.boundary == null) {
  39. throw new FileUploadException("the request was rejected because no multipart boundary was found");
  40. }
  41.  
  42. this.notifier = new MultipartStream.ProgressNotifier(FileUploadBase.this.listener, ctx.getContentLength());
  43.  
  44. this.multi = new MultipartStream(input, this.boundary, this.notifier);
  45. this.multi.setHeaderEncoding(charEncoding);
  46.  
  47. this.skipPreamble = true;
  48. findNextItem();
  49. }

第二种限制对应的关键性源码(位置:struts2-core-2.3.1.2.jar包下\org\apache\struts2\interceptor\FileUploadInterceptor.java)

  1. protected boolean acceptFile(Object action, File file, String filename, String contentType, String inputName, ValidationAware validation, Locale locale)
  2. {
  3. boolean fileIsAcceptable = false;
  4.  
  5. if (file == null) {
  6. String errMsg = getTextMessage(action, "struts.messages.error.uploading", new Object[] { inputName }, locale);
  7. if (validation != null) {
  8. validation.addFieldError(inputName, errMsg);
  9. }
  10.  
  11. if (LOG.isWarnEnabled())
  12. LOG.warn(errMsg, new String[0]);
  13. }
  14. //看这里
    else if ((this.maximumSize != null) && (this.maximumSize.longValue() < file.length())) {
  15. String errMsg = getTextMessage(action, "struts.messages.error.file.too.large", new Object[] { inputName, filename, file.getName(), "" + file.length() }, locale);
  16. if (validation != null) {
  17. validation.addFieldError(inputName, errMsg);
  18. }
  19.  
  20. if (LOG.isWarnEnabled())
  21. LOG.warn(errMsg, new String[0]);
  22. }
  23. else if ((!this.allowedTypesSet.isEmpty()) && (!containsItem(this.allowedTypesSet, contentType))) {
  24. String errMsg = getTextMessage(action, "struts.messages.error.content.type.not.allowed", new Object[] { inputName, filename, file.getName(), contentType }, locale);
  25. if (validation != null) {
  26. validation.addFieldError(inputName, errMsg);
  27. }
  28.  
  29. if (LOG.isWarnEnabled())
  30. LOG.warn(errMsg, new String[0]);
  31. }
  32. else if ((!this.allowedExtensionsSet.isEmpty()) && (!hasAllowedExtension(this.allowedExtensionsSet, filename))) {
  33. String errMsg = getTextMessage(action, "struts.messages.error.file.extension.not.allowed", new Object[] { inputName, filename, file.getName(), contentType }, locale);
  34. if (validation != null) {
  35. validation.addFieldError(inputName, errMsg);
  36. }
  37.  
  38. if (LOG.isWarnEnabled())
  39. LOG.warn(errMsg, new String[0]);
  40. }
  41. else {
  42. fileIsAcceptable = true;
  43. }
  44.  
  45. return fileIsAcceptable;
  46. }

 四:参考的网络资源如下

1)Struts2文件上传大小限制相关

http://www.cnblogs.com/highriver/archive/2011/06/01/2065557.html

http://www.cnblogs.com/forlina/archive/2011/09/08/2171404.html

http://www.docin.com/p-633913742.html

2)Struts2拦截器相关

http://struts2.group.iteye.com/group/wiki/1397-deep-into-struts2-interceptors

http://www.open-open.com/lib/view/open1338339244354.html

http://blog.csdn.net/qjyong/article/details/1824607

struts2文件上传大小限制问题小结的更多相关文章

  1. struts2文件上传大小限制问题小结(引用)

    最后解决办法: 页面js控制上传文件的大小,在页面进行控制.如下代码 inputs是所有文本上传input DOM //名称信息 var nameStr=''; //大小信息 var sizeStr= ...

  2. struts2文件上传大小限制问题

    struts2默认文件上传大小为2M,如需修改默认大小,解决方法如下: <struts> <constant name="struts.multipart.maxSize& ...

  3. (八)Struts2 文件上传和下载

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...

  4. struts2设置文件上传大小

    利用struts2想要设置或者限制上传文件的大小,可以在struts.xml配置文件里面进行如下配置: <constant name="struts.multipart.maxSize ...

  5. 【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】

    一.struts2文件上传 1.上传文件的时候要求必须使得表单的enctype属性设置为multipart/form-data,把它的method属性设置为post 2.上传单个文件的时候需要在Act ...

  6. Struts2文件上传下载

    Struts2文件上传 Struts2提供 FileUpload拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容,fileUpload拦截器 默认在defau ...

  7. Struts2文件上传和下载(原理)

    转自:http://zhou568xiao.iteye.com/blog/220732 1.    文件上传的原理:表单元素的enctype属性指定的是表单数据的编码方式,该属性有3个值:1)     ...

  8. Struts2 文件上传

    一:表单准备 ① 要想使用HTML 表单上传一个或多个文件     –须把 HTML表单的 enctype属性设置为multipart/form-data     –须把HTML 表单的method ...

  9. JAVA Web 之 struts2文件上传下载演示(二)(转)

    JAVA Web 之 struts2文件上传下载演示(二) 一.文件上传演示 详细查看本人的另一篇博客 http://titanseason.iteye.com/blog/1489397 二.文件下载 ...

随机推荐

  1. 手把手教你玩转Git分布式版本控制系统!

    目录 Git诞生历史 Git环境准备 Git安装部署 Git常用命令 Git基本操作 Git管理分支结构 Git管理标签 GitLab安装部署 GitHub托管服务 Git客户端工具 1 Git诞生历 ...

  2. HBASE解析

    Hbase是运行在Hadoop上的NoSQL数据库,它是一个分布式的和可扩展的大数据仓库,也就是说HBase能够利用HDFS的分布式处理模式,并从Hadoop的MapReduce程序模型中获益.这意味 ...

  3. DBA_Oracle冷备份案例脚本本法(案例)

    2014-08-10 Created By BaoXinjian

  4. hdu 5698 瞬间移动(排列组合)

    这题刚看完,想了想,没思路,就题解了 = = 但不得不说,找到这个题解真的很强大,链接:http://blog.csdn.net/qwb492859377/article/details/514781 ...

  5. NeHe OpenGL教程 第三十九课:物理模拟

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. Web Uploader文件上传&&使用webupload有感(黄色部分)

    引入资源 使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF. <!--引入CSS--> <link rel="stylesheet" ...

  7. JQuery之DataTables强大的表格解决方案

    1.DataTables的默认配置 $(document).ready(function() { $('#example').dataTable(); } ); 示例:http://www.guoxk ...

  8. 30天轻松学习javaweb_https协议的密码学

    https通过非对称加密实现数据安全1.CA机构提供数字证书,其中数字证书包含公钥.2.浏览器自带功能验证数字证书是否是CA机构颁发的.3.根据数字证书包含的公钥对表单数据进行加密.4.公钥提供方再根 ...

  9. bat命令之for命令详解

    ______________版主提醒____________________________ 为了避免影响技术讨论.提高看帖的舒适性,请大家不要在此帖下跟无实质内容的口水帖,特别是纯顶.纯支持.纯感谢 ...

  10. 《c++程序设计》笔记

    本文是学习谭浩强老师的<c++程序设计>后的笔记. 1.概述 c++是贝尔实验室在c语言的基础上发展而来,与c兼容.用c语言写的程序可以不加修改用于c++.从c++的名字可以看出它是c的超 ...