文件上传和下载

struts2集成了apache的commons-fileupload组件,文件上传的代码编写非常简单。除此之外,还提供了stream结果视图,简化了文件下载代码的编写。

文件上传

我们直接看一个文件上传的例子。

UploadAction.java

package com.gacfox.action;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

import com.opensymphony.xwork2.ActionSupport;

public class UploadAction extends ActionSupport
{
    private File photo;
    private String photoFileName;//命名约定为xxxFileName
    private String photoContentType;//命名约定为xxxContentType

    public String upload()
    {
        String basePath = "/home/gacfox/";
        File file = new File(basePath + photoFileName);
        try
        {
            FileUtils.copyFile(photo, file);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return NONE;
    }

  ... set和get方法略
}

upload.jsp

<s:form action="upload.action" enctype="multipart/form-data">
  <s:file name="photo" accept="image/png"></s:file>
  <s:submit value="submit"></s:submit>
</s:form>

struts2中,文件上传的代码编写就是这么简单,框架已经把很多工作都为我们处理好了,我们需要的只是在Action类中按照约定,定义好几个类属性,框架会在Action实例化后自动注入值。

处理文件上传失败

如果上传了一个超过默认限制大小的文件,这里会出现一点小问题,浏览器看到的现象是连接被重置(Tomcat版本>7有此现象),而不是输出错误信息。

我使用的struts2.3和Tomcat7,网上给出的解释是Tomcat和struts2框架的兼容性问题,解决方法暂时不明。

对上传文件进行校验可以使用编程式验证,向JSP页面输出错误信息,这种方式比较简单。还可以通过调整struts2文件上传大小限制的常量,以及文件上传处理的拦截器参数,对上传文件进行声明式的验证,但是我觉得比较麻烦,输出的错误信息也不好控制。

  • struts.multipart.maxSize struts2框架允许的最大文件上传大小

多文件上传

一个表单如果包含多个文件上传标签,同时上传多个文件,此时把Action中的几个属性全改成数组就行了。struts2会自动初始化数组,填入合适的数据,这里就不多演示了。

文件下载

下面是文件下载的例子。

DownloadAction.java

package com.gacfox.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport
{
    private InputStream inputStream;
    private String fileName = "icon.png";

    public String download() throws FileNotFoundException
    {
        inputStream = new FileInputStream(new File("/home/gacfox/icon.png"));
        return SUCCESS;
    }

  ... set和get方法略
}

struts.xml

<action name="download" class="com.gacfox.action.DownloadAction" method="download">
  <result type="stream">
    <param name="inputName">inputStream</param>
    <param name="contentDisposition">attachment;filename=${fileName}</param>
    <param name="contentType">image/png</param>
  </result>
</action>

文件下载的编写也非常简单,框架都为我们处理好了,我们只需要实例化输入流对象交给框架即可,struts.xml中,需要配置结果视图的类型type为stream,同时需要传入几个参数,非别是流对象的属性名(在这里就是DownloadAction的inputStream),还有两个HTTP响应头,表示以下载方式获取,MIME类型为png图片。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。