struts2单个文件上传的两种实现方式


在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中实现单个文件上传的两种常见方式。选择哪种方式取决于你的具体需求和偏好。