在Struts2中,单个文件上传通常可以通过配置struts.xml和使用相应的Action类来实现。以下是两种常见的实现方式:
### 方式一:使用表单标签和Action类属性
1. **JSP页面**:使用`
<s:form action="upload" method="post" enctype="multipart/form-data">
<s:file name="fileUpload" label="File Upload" />
<s:submit value="Upload" />
</s:form>
2. **Action类**:在Action类中定义一个File类型的属性来接收上传的文件,并可能包含该文件的文件名和内容类型等其他属性。
public class FileUploadAction extends ActionSupport {
private File fileUpload; // 上传的文件
private String fileUploadFileName; // 上传文件的名称
private String fileUploadContentType; // 上传文件的类型
// 省略getter和setter方法
public String execute() throws Exception {
// 处理文件上传逻辑
return SUCCESS;
}
}
3. **struts.xml配置**:在struts.xml中配置action,确保action的class属性指向你的Action类,并且配置了文件上传的拦截器栈(如`fileUpload`)。
<action name="upload" class="com.example.FileUploadAction" method="execute">
<interceptor-ref name="fileUpload">
<param name="maximumSize">10485760</param> <!-- 最大文件大小 -->
<param name="allowedTypes">image/jpeg,image/gif</param> <!-- 允许的文件类型 -->
</interceptor-ref>
<interceptor-ref name="defaultStack"/>
<result name="success">/success.jsp</result>
<result name="input">/upload.jsp</result>
</action>
### 方式二:使用Servlet API
虽然Struts2提供了自己的文件上传机制,但在某些情况下,直接使用Servlet API来处理文件上传也是可行的。
1. **Action类**:通过实现`ServletRequestAware`接口来访问`HttpServletRequest`对象,从而可以使用Servlet API进行文件上传。
public class ServletFileUploadAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() throws Exception {
// 使用Servlet API中的文件上传逻辑,如使用Apache Commons FileUpload库
// 示例省略具体上传逻辑
return SUCCESS;
}
}
**注意**:使用Servlet API方式时,你通常需要自己处理文件上传的细节,比如解析请求、创建文件对象等,这可能会使代码相对复杂一些。同时,由于Struts2的拦截器链默认不包括Servlet API的调用,因此你可能需要手动配置拦截器或完全绕过Struts2的文件上传机制。
以上就是在Struts2中实现单个文件上传的两种常见方式。选择哪种方式取决于你的具体需求和偏好。