`
lichen0921
  • 浏览: 81175 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多

问题:

在使用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以后的版本才有的类。

 

______________________________________________________

 

 

看完以上, 修改struts.xml文件

<!-- 临时文件存放路径 -->
	<constant name="struts.multipart.saveDir" value="D://chain/jboss-web/MyTemp/"></constant>

 有待测试验证.

分享到:
评论

相关推荐

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

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

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

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

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

    Apache Commons FileUpload是处理`multipart/form-data`请求的一个强大工具。首先,需要在项目中引入该库。然后,创建一个`ServletFileUpload`实例,并使用`parseRequest()`方法解析请求。这个方法会返回一个`...

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

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

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

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

    android向struts服务器端上传文件代码

    能实现android客户端向struts上传文件功能,用的是HttpURLConnection,注意设置请求头的编码为“utf-8",能解决文件名是中文的问题,不然会报错,rg.apache.commons.fileupload.FileUploadBase$IOFileUploadException:...

    servlet3.0文件上传 01.zip

    否则会出现如下异常:java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly

    servlet3.0实现文件上传——demo1.zip

    否则会出现如下异常:java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly

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

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

    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,可以解析请求,获取...

    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.3.jar commons-io-2.5.jar

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

    commons-fileupload-1.2.1.jar 和commons-io-1.4.jar

    在实际开发中,当你需要在Web应用中实现文件上传功能时,首先会配置`commons-fileupload-1.2.1.jar`来解析请求,然后利用`commons-io-1.4.jar`处理上传后的文件,比如保存到服务器的指定目录,或者进行一些预处理...

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

    `commons-fileupload-1.2.1.jar` 是Apache Commons FileUpload的1.2.1版本,它专门用于处理HTTP请求中的多部分/form-data数据,也就是通常所说的文件上传功能。这个库简化了在Servlet或JSP应用中接收和处理用户上传...

    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.3.2.jar

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

    commons-fileupload-1.3.3-bin.tar.gz

    标题中的"commons-fileupload-1.3.3-bin.tar.gz"是一个压缩包文件,包含了Apache Commons FileUpload 1.3.3版本的二进制(bin)文件,通常包括JAR库和其他必要的资源。 Apache Commons FileUpload的工作原理是基于...

    JAVAcommons-fileupload-1.4.jar和commons-io-2.6.jar

    本话题将详细讲解`JAVAcommons-fileupload-1.4.jar`和`commons-io-2.6.jar`这两个库,它们在处理文件上传和输入/输出操作时扮演着关键角色。 **Apache Commons FileUpload** `commons-fileupload-1.4.jar`是Apache...

    struts2上传文件需要的jar包 commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar

    6. **异常处理**:务必处理可能出现的异常,如文件过大、非法文件类型等,确保上传过程的安全性。 7. **返回响应**:根据文件上传的结果,向客户端返回适当的反馈,如成功消息、错误提示等。 以上就是关于Struts2...

    commons-fileupload-1.2.2.jar和commons-io-2.0.1.jar组件

    5. **异常处理**:提供了一套完善的异常处理机制,方便开发者捕获和处理文件上传过程中的错误。 **Apache Commons IO** `commons-io-2.0.1.jar` 是Apache Commons IO项目的早期版本,它提供了一系列实用工具类,...

Global site tag (gtag.js) - Google Analytics