`
daha33
  • 浏览: 52467 次
社区版块
存档分类
最新评论

struts中post方式上传文件,enctype="multipart/form-data"

阅读更多
struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file") 是null的问题分析

这两天连续看到有人提到:struts中post方式上传文件,enctype="multipart/form-data",request.getParameter("file")时候,得到一个Null,或者直接得到 java.lang.IllegalArgumentException 这样一个异常。

结合到自己以前也遇到过这个问题,于是上网搜索了一些资料,下面这位网友的说法我觉得有些道理,因此摘抄下来。(红色自己为别人的分析,我觉得有道理)

使用struts进行文件上传,如果有些参数没有完全定义在ActionForm中,需要从request.getParameter获取,在表单提交并且validate失败返回input页面时,这部分需要从request.getPrameter获取的参数数据都丢失了,即使再对request进行multipart解析也不能得到。

经过分析,发现struts的ActionServlet在接收到multipart请求之后,在RequestProcessor中会对request进行封装:MultiRequestWrapper,然后在Action执行完之后,又将已经封装的request重新还原。以下是部分代码,截直RequestProcessor:

封装: 下面是struts的源代码:

protected HttpServletRequest processMultipart(HttpServletRequest request) {

    if (!"POST".equalsIgnoreCase(request.getMethod())) {
        return (request);
    }
   
    String contentType = request.getContentType();
    if ((contentType !=null) &&
        contentType.startsWith("multipart/form-data")) {
        return (new MultipartRequestWrapper(request));
    }else{
        return (request);
    }

  }

接下来我们需要作的就是将已经封装成MultipartRequestWrapper的HttpServletRequest进行还原。
解决方法: 
① 写一个类,继承org.apache.struts.action.RequestProcessor ,并且override其中的doForward方法来进行解析。

package org.luyang;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.upload.MultipartRequestWrapper;

public class RequestProcessor extends org.apache.struts.action.RequestProcessor {

    protected void doForward(String uri, HttpServletRequest request,  HttpServletResponse response) throws IOException, ServletException {
        HttpServletRequest myRequest = request;
        if (request instanceof MultipartRequestWrapper) {
            myRequest = ((MultipartRequestWrapper) request).getRequest();
        }
        super.doForward(uri, myRequest, response);
    }
}

②在自己的struts-config.xml的<struts-config></struts-config>之间加入下面这句话

  <controller processorClass="org.luyang.RequestProcessor" />
  <message-resources parameter="ApplicationResources"/>
分享到:
评论

相关推荐

    java ssh上传文件代码

    在Action类中,需要定义一个`File`或`FileItem`类型的属性来接收上传的文件,并在struts.xml配置文件中启用文件上传支持。同时,记得设置`&lt;constant name="struts.multipart.saveDir" value="your/directory/path"/&gt;...

    struts1.x上传实例

    &lt;form action="fileup.do" method="post" enctype="multipart/form-data" &gt; 文件:&lt;input type="file" name="filedata"/&gt; 2.struts-config.xml文件配置 &lt;form-beans&gt; &lt;form-bean name="actionForm" ...

    Struts2文件的上传和下载

    Struts2会自动处理`multipart/form-data`类型的请求,并将文件内容封装在`ServletActionContext`中,可以通过`ServletActionContext.getRequest().getParts()`来访问上传的文件。例如: ```java public class ...

    strut2上传文件注意

    在Struts2中进行文件上传时,首先需要在表单元素中设置`enctype`属性为`multipart/form-data`。这一步非常重要,因为默认情况下表单提交的数据会被编码成`application/x-www-form-urlencoded`格式,这种格式不支持...

    struts文件上传.pdf

    &lt;form action="upload" method="post" enctype="multipart/form-data"&gt; &lt;html:file property="coverImage" /&gt; &lt;input type="submit" value="Upload" /&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt; ``` 通过以上步骤,我们可以...

    Struts2多个文件上传

    这两个库提供了文件上传的基础功能,使得Struts2能够处理`multipart/form-data`类型的请求,这是文件上传的标准格式。 Struts2本身并不包含一个内置的请求解析器来处理文件上传。相反,它依赖于第三方库,如Jakarta...

    java上传文件资料

    另一个需要注意的问题是,当涉及文件上传时,`&lt;form&gt;`标签必须包含`enctype="multipart/form-data"`属性。这是因为文件上传的数据格式是multipart/form-data,而不是默认的application/x-www-form-urlencoded。后者...

    struts2s上传文件

    &lt;form action="upload" method="post" enctype="multipart/form-data"&gt; &lt;input type="file" name="uploadFile" /&gt; &lt;input type="submit" value="上传" /&gt; &lt;/form&gt; ``` 4. **处理上传**:在Action类的execute方法...

    struts2文件上传

    在Struts2框架中,虽然它自身不处理`multipart/form-data`类型的请求,但它依赖于第三方库,如Apache Commons FileUpload,来实现文件上传的功能。 文件上传的基本原理涉及到HTML表单的`enctype`属性。当`enctype`...

    struts2 文件上传,也可以多文件上传

    3. **JSP页面**:在表单中,使用`&lt;s:file&gt;`标签来选择要上传的文件,并设置enctype="multipart/form-data"。 ```jsp &lt;form action="upload.action" method="post" enctype="multipart/form-data"&gt; &lt;s:file name=...

    struts多附件上传

    2. Java中的Commons FileUpload库用于处理multipart/form-data数据,它可以解析请求并获取上传文件的信息。 三、实现步骤 1. 添加依赖:在项目中引入Struts框架和Commons FileUpload库的依赖。 2. 创建Action类:...

    Struts上传,已经处理好乱码问题

    &lt;form action="upload.do" method="post" enctype="multipart/form-data"&gt; &lt;input type="file" name="file" /&gt; &lt;input type="submit" value="上传" /&gt; &lt;/form&gt; ``` 总结,Struts框架处理文件上传涉及的主要步骤...

    struts2中单文件,多文件上传

    在JSP页面中,我们需要使用Struts2的`s:form`标签来创建表单,注意设置`enctype="multipart/form-data"`以支持文件上传。对于单文件上传,可以使用`s:file`标签;对于多文件上传,可以使用`s:file`标签嵌套在`s:...

    Struts1文件上传、单文件、多文件上传(上传文件大小问题,如何设置无限制)

    &lt;form action="upload.action" method="post" enctype="multipart/form-data"&gt; name: &lt;input type="text" name="name"/&gt; &lt;br/&gt; upload: &lt;input type="file" name="file"/&gt; &lt;br/&gt; &lt;input type="submit" value=...

    实现struts2的文件上传文件功能

    &lt;form action="uploadAction" method="POST" enctype="multipart/form-data"&gt; &lt;input type="file" name="file" /&gt; &lt;input type="submit" value="Upload" /&gt; &lt;/form&gt; ``` 4. **编写Action类** 创建一个继承自`...

    struts2的上传和struts2的upload

    1. ** multipart/form-data **: 文件上传通常涉及到HTTP的multipart/form-data编码类型,这是浏览器在发送包含文件的表单时使用的编码方式。 2. ** FileUpload拦截器 **: Struts2提供了一个名为`FileUpload`的拦截...

    Struts2 上传文件

    &lt;form id="form1" name="form1" enctype="multipart/form-data" method="post" action="uploadAction"&gt; 上传文件:&lt;input type="file" name="uploadFile"/&gt;&lt;br/&gt; 请求参数:&lt;input type="text" name="wawa"/&gt;&lt;br/&gt;...

    struts2.0上传文件

    在Struts2中,实现文件上传是一项常见的需求,这通常涉及到处理用户通过表单提交的多部分请求(multipart/form-data)。文件上传功能允许用户在Web应用中上传文件,如图片、文档或其他数据。 一、原理介绍 在HTTP...

    Struts2 单个、批量文件上传 精简源码

    同时,你还需要设置表单的`enctype`属性为`multipart/form-data`,以支持文件上传。 例如,一个简单的Struts2单文件上传Action可能如下: ```java public class UploadAction extends ActionSupport { private ...

    Struts1实现文件上传源码

    &lt;html:form action="/upload" method="post" enctype="multipart/form-data"&gt; &lt;html:file property="file" name="uploadForm" /&gt; &lt;input type="submit" value="上传" /&gt; &lt;/html:form&gt; ``` 5. **异常处理**:在...

Global site tag (gtag.js) - Google Analytics