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"/>
分享到:
相关推荐
在Action类中,需要定义一个`File`或`FileItem`类型的属性来接收上传的文件,并在struts.xml配置文件中启用文件上传支持。同时,记得设置`<constant name="struts.multipart.saveDir" value="your/directory/path"/>...
<form action="fileup.do" method="post" enctype="multipart/form-data" > 文件:<input type="file" name="filedata"/> 2.struts-config.xml文件配置 <form-beans> <form-bean name="actionForm" ...
Struts2会自动处理`multipart/form-data`类型的请求,并将文件内容封装在`ServletActionContext`中,可以通过`ServletActionContext.getRequest().getParts()`来访问上传的文件。例如: ```java public class ...
在Struts2中进行文件上传时,首先需要在表单元素中设置`enctype`属性为`multipart/form-data`。这一步非常重要,因为默认情况下表单提交的数据会被编码成`application/x-www-form-urlencoded`格式,这种格式不支持...
<form action="upload" method="post" enctype="multipart/form-data"> <html:file property="coverImage" /> <input type="submit" value="Upload" /> </form> </body> </html> ``` 通过以上步骤,我们可以...
这两个库提供了文件上传的基础功能,使得Struts2能够处理`multipart/form-data`类型的请求,这是文件上传的标准格式。 Struts2本身并不包含一个内置的请求解析器来处理文件上传。相反,它依赖于第三方库,如Jakarta...
另一个需要注意的问题是,当涉及文件上传时,`<form>`标签必须包含`enctype="multipart/form-data"`属性。这是因为文件上传的数据格式是multipart/form-data,而不是默认的application/x-www-form-urlencoded。后者...
<form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="uploadFile" /> <input type="submit" value="上传" /> </form> ``` 4. **处理上传**:在Action类的execute方法...
在Struts2框架中,虽然它自身不处理`multipart/form-data`类型的请求,但它依赖于第三方库,如Apache Commons FileUpload,来实现文件上传的功能。 文件上传的基本原理涉及到HTML表单的`enctype`属性。当`enctype`...
3. **JSP页面**:在表单中,使用`<s:file>`标签来选择要上传的文件,并设置enctype="multipart/form-data"。 ```jsp <form action="upload.action" method="post" enctype="multipart/form-data"> <s:file name=...
2. Java中的Commons FileUpload库用于处理multipart/form-data数据,它可以解析请求并获取上传文件的信息。 三、实现步骤 1. 添加依赖:在项目中引入Struts框架和Commons FileUpload库的依赖。 2. 创建Action类:...
<form action="upload.do" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="上传" /> </form> ``` 总结,Struts框架处理文件上传涉及的主要步骤...
在JSP页面中,我们需要使用Struts2的`s:form`标签来创建表单,注意设置`enctype="multipart/form-data"`以支持文件上传。对于单文件上传,可以使用`s:file`标签;对于多文件上传,可以使用`s:file`标签嵌套在`s:...
<form action="upload.action" method="post" enctype="multipart/form-data"> name: <input type="text" name="name"/> <br/> upload: <input type="file" name="file"/> <br/> <input type="submit" value=...
<form action="uploadAction" method="POST" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="Upload" /> </form> ``` 4. **编写Action类** 创建一个继承自`...
1. ** multipart/form-data **: 文件上传通常涉及到HTTP的multipart/form-data编码类型,这是浏览器在发送包含文件的表单时使用的编码方式。 2. ** FileUpload拦截器 **: Struts2提供了一个名为`FileUpload`的拦截...
<form id="form1" name="form1" enctype="multipart/form-data" method="post" action="uploadAction"> 上传文件:<input type="file" name="uploadFile"/><br/> 请求参数:<input type="text" name="wawa"/><br/>...
在Struts2中,实现文件上传是一项常见的需求,这通常涉及到处理用户通过表单提交的多部分请求(multipart/form-data)。文件上传功能允许用户在Web应用中上传文件,如图片、文档或其他数据。 一、原理介绍 在HTTP...
同时,你还需要设置表单的`enctype`属性为`multipart/form-data`,以支持文件上传。 例如,一个简单的Struts2单文件上传Action可能如下: ```java public class UploadAction extends ActionSupport { private ...
<html:form action="/upload" method="post" enctype="multipart/form-data"> <html:file property="file" name="uploadForm" /> <input type="submit" value="上传" /> </html:form> ``` 5. **异常处理**:在...