`

Struts FileUpload - Processing of multipart/form-data request failed

 
阅读更多

Struts FileUpload 异常处理之Processing of multipart/form-data request failed.

 

在使用FileUpload的过程中,有一个经常抛出异常如下:

 

ERROR [http-8081-Processor21] (CommonsMultipartRequestHandler.java:201) -2008-04-10 11:20:27,671 Failed to parse multipart request

org.apache.commons.fileupload.FileUploadException: Processing of multipart/form-data request failed. temp\upload__3d7cf8b_11936276cf8__7ffd_00000011.tmp (系统找不到指定的路径。)

    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:384)

    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:268)

    at org.apache.struts.upload.CommonsMultipartRequestHandler.handleRequest(CommonsMultipartRequestHandler.java:193)

    at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:443)

    at org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:804)

    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)

    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)

    at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 

 

 

 

问题分析:

 

在我使用Struts FileUpload时有以下几个关键部分: 

 

定义Form的Enctype属性multipart/form-data,添加<input type=file>的域; 在FormBean中定义与file域名称相同、类型为FormFile的属性; 在strut-config.xml定义或修改controller标记,分别设置maxFileSize=10M、bufferSize=4096、tempDir=temp、inputForward=true等属性; 获得FormFile类型的属性,将字节流写入指定的文件中。 

 

而在不超出maxFileSize的范围中有一些较大文件都不能上传成功,并抛出上述异常,在指定的tempDir目录中也不能找到相应的tmp文件。在已知的单独使用commons-fileupload时经常使用的handler是ServletFileUpload或DiskFileUpload,而在查到的资料中的解释是使用DiskFileUpload就可以解决上面的问题,那么StrutsFileUpload是怎么使用这些类来处理上传的呢?查看struts-config_1_2.dtd有一个属性是multipartClass是用来设置处理这种请求的类,默认值是CommonsMultipartRequestHandler,那么应该有其它不同的处理类,于是在"org.apache.struts.upload中找到类DiskMultipartRequestHandler。这个类的处理方式是直接在临时文件目录写临时文件。那么定义multipartClass=org.apache.struts.upload.DiskMultipartRequestHandler,则异常不再出现。

 

但是javadoc中明明白白的写的是在commons-fileupload以后的版本中DiskMultipartRequestHandler类将由CommonsMultipartRequestHandler替代,使用CommonsMultipartRequestHandler才是明智的选择。那么分析一下,发现后者可用的原因就应该在于后者是使用硬盘空间作为交换空间,则前者就应当是使用内存做为交换空间的,那么使用内存空间应该是有边界限制的,这个属性就是memFileSize,其默认值是256K,在上传抛出异常时使用的文件就是大于这个数字的文件,发现它对应的其实就是DiskFileItemFactory的sizeThreshold属性。而对memFileSize的解释就是上传时可以在内存中保留的文件的最大值,超出这个数字则保存在其它的介质中如硬盘。也就是说要正常使用CommonsMultipartRequestHandler类处理上传请求,可以将memFileSize定义到与maxFileSize一样大,但显而易见的是一旦有更大的上传文件需求时,就会重新遇到问题,如此大的内存开销是显然是不合理的。

 

按道理来讲,CommonsMultipartRequestHandler做为multipartClass默认值和下一版本的保留类,应该是可以正确的使用配置文件中定义的memFileSize属性的,那么既然在异常中有“系统找不到指定的路径”字样,那就从文件系统的路径来试着解决问题。tempDir指定的目录是temp,异常的提示应该就是找不到这个目录,从本机应用中来看这个temp就是tomcat根目录下的temp,但就是这个目录在我本机上是可以找到的,在服务器上却总是提示异常。查看struts-config_1_2.dtd,对于这个参数的解释是“指定文件上传时的临时工作目录.如果没有设置,将才用Servlet容器为web应用分配的临时工作目录”。那么在我的应用中如果不指定tempDir,这个目录就是%TOMCAT_HOME%\temp;如果指定的话,就要指定绝对路径,如“C:\\temp”。

 

解决方法:

 

1、指定multipartClass为org.apache.struts.upload.DiskMultipartRequestHandler,不推荐使用这种方式;

 

2、指定memFileSize与maxFileSize相同的值,用于上传文件较小的情况,这种方式其实也是一种错误的方式,不推荐;

 

3、指定tempDir为绝对目录;

 

4、如果应用服务器可以为应用分配临时目录的话,可以不指定tempDir;

 

5、即便tempDir指定的是相对目录,如tempDir="temp",也并不是错误的,它应该是存在于当然应用的一个相对目录。

 

补充:

 

tempDir指定的目录中可能会随着时间推移出现很多后缀为"tmp"的垃圾文件,commons-fileupload提供了一个不错的解决方法,就是把下面的代码加入到web.xml中即可。

 

<listener>

        <listener-class>

          org.apache.commons.fileupload.servlet.FileCleanerCleanup

        </listener-class>

</listener> 

 

需要注意的是FileCleanerCleanup是commons-fileupload1.2以后的版本才有的类。


分享到:
评论

相关推荐

    解决java enctype multipart form-data文件上传传值问题

    - `commons-fileupload`:用于解析`multipart/form-data`数据。 - `jxl`:用于读取Excel文件。 2. **创建Servlet**: - 继承`HttpServlet`类。 - 实现`doPost`方法,用于处理POST请求。 3. **解析请求**: - ...

    上传文件fileupload+解决enctype= multipart/form-data无法传递其他参数

    Apache Commons IO是处理IO操作的工具集,而Commons Fileupload则是专门用来处理文件上传的库,它可以方便地处理`multipart/form-data`编码的表单数据。 以下是关于这个话题的详细知识点: 1. **HTML表单与文件...

    解决当FORM的ENCTYPE="multipart/form-data" 时request.getParameter()获取不到值的方法 ?

    在探讨“解决当FORM的ENCTYPE='multipart/form-data'时request.getParameter()获取不到值的方法”这一主题时,我们首先需要理解为什么在特定情况下,传统的`request.getParameter()`方法无法正常工作,以及如何通过...

    java 页面上有ENCTYPE="multipart/form-data" 时action方法或者控制层用request.getParameter()获取不到值的方法 ?

    在Java Web开发中,我们经常遇到表单提交数据的情况,特别是涉及到文件上传时,`&lt;form&gt;`标签的`ENCTYPE`属性通常会被设置为`multipart/form-data`。这是因为`multipart/form-data`允许在请求中携带二进制数据,如...

    开发工具 commons-fileupload-1.3.2

    开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2开发工具 commons-fileupload-1.3.2...

    struts2中json依赖包

    asm-3.3.jar/asm-commons-3.3.jar/asm-tree-3.3.jar/commons-beanutils-1.8.3.jar/commons-collections-3.2.1.jar/commons-fileupload-1.3.1.jar/commons-io-2.2.jar/commons-lang-2.5.jar/commons-lang3-3.2.jar/...

    commons-fileupload-1.4-API文档-中文版.zip

    赠送jar包:commons-fileupload-1.4.jar; 赠送原API文档:commons-fileupload-1.4-javadoc.jar; 赠送源代码:commons-fileupload-1.4-sources.jar; 赠送Maven依赖信息文件:commons-fileupload-1.4.pom; 包含...

    http post上传文件与表格 ContentType = multipart/form-data

    在表单提交时,浏览器会自动将这些数据打包成multipart/form-data格式。每部分数据都用边界(boundary)来分隔,边界是一个唯一的字符串,确保服务器能够正确解析各部分。 以下是一个简单的multipart/form-data请求...

    commons-fileupload-1.3.2.jar

    这个"commons-fileupload-1.3.2.jar"是该库的1.3.2版本,它支持Java Development Kit (JDK) 1.5及以上版本。在本文中,我们将深入探讨Apache Commons FileUpload库的核心功能、特性以及如何在实际项目中使用它。 ...

    commons-fileupload-1.2.jar和commons-io-1.3.2.jar

    //注意action地址,还有enctype要写成multipart/form-data,和method="POST" &lt;form name="uploadform" method="POST" action="./servlet/FileUpload" ENCTYPE="multipart/form-data"&gt; &lt;tr&gt;&lt;td width="100%" ...

    commons-fileupload-1.3.jar和commons-io-1.2.jar.zip

    在HTTP协议中,文件上传通常使用`multipart/form-data`编码类型进行,FileUpload库可以解析这种复杂的请求内容,将上传的文件转换为易于处理的对象。 1. **使用步骤**: - 引入依赖:在项目中添加commons-...

    commons-fileupload-1.3.3

    commons-lang-2.3.jar,在使用组件实现文件上传时候要注意前后台的一致性,注意在后台定义File文件对象名要与jsp页面中的file标签name名字一致,前台form标签属性一定要设置为enctype="multipart/form-data",而且...

    commons-fileupload-1.2.2

    commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-fileupload-1.2.2commons-...

    struts2.1.6+spring2.0+hibernate3.2常用配置包

    commons-fileupload-1.1.1.jar //2 commons-io-1.1.jar //2 commons-lang-2.1.jar //2 commons-logging-1.0.4.jar //2 commons-logging-api-1.1.jar //2 * commons-validator-1.3.1.jar //2 derbyclient.jar //3 ...

    commons-fileupload-1.3.3.jar commons-io-2.5.jar

    1. **配置Servlet容器**:首先,你需要确保你的Servlet容器(如Tomcat、Jetty)已经配置了对multipart/form-data请求的支持。这通常涉及到在web.xml文件中配置一个MultipartConfig元素。 2. **依赖引入**:在你的...

    commons-fileupload-1.2.2-bin.zip

    "commons-fileupload-1.2.2-bin.zip"是这个库的一个特定版本,即1.2.2版的二进制发行包,包含所有必要的类和资源文件,可以方便地集成到Java项目中。 文件上传在Web应用中是一个重要且复杂的任务,因为HTTP协议本身...

    commons-fileupload-1.3.3-bin.tar.gz

    1. **多部分/形式数据解析**:在HTTP上传文件时,数据被封装在`multipart/form-data`格式中。FileUpload库负责解析这种格式,提取每个部分的内容。 2. **内存和磁盘管理**:FileUpload库可以动态选择将文件内容存储...

    commons-fileupload-1.4-bin.zip

    标题中的"commons-fileupload-1.4-bin.zip"表明这是一个包含Apache Commons FileUpload 1.4版本的二进制文件包,而描述中的"fileupload-1.4"进一步确认了这个版本号。 Apache Commons FileUpload的主要功能在于解析...

    commons-fileupload-1.3.3.jar和commons-io-2.6.jar

    Apache Commons FileUpload库 (`commons-fileupload-1.3.3.jar`) 是一个针对Servlet API的扩展,允许开发者处理multipart/form-data类型的HTTP请求,这种类型通常用于上传文件。它提供了一组API,可以解析请求,获取...

    Struts2-2.3.16 全jar包

    commons-fileupload-1.2.1.jar//文件上传时用的,为了以后用到,最好加入 commons-io-1.3.2.jar//同上 commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar struts2-core-2.2.1.1....

Global site tag (gtag.js) - Google Analytics