0%

struts2 文件下载处理

这里说的文件下载指的是通过Java代码返回文件流给客户端,而不是直接链接一个具体的文件URL。 原理:Action中定义一个读取文件流的方法,返回值为InputStream,声明Action时,result类型为stream,参数指定读取文件流的方法以及返回给客户端的文件名。 下面的例子是让用户自己提交文件路径,Action再读取该文件并返回给客户端,当然,在真实的项目中,这样做是很不安全的。 DownloadAction2.java:

package com.struts2;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction2 extends ActionSupport {
    
    private String fileName;
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public InputStream getDownloadFile()
    {
        //以下几行先把get得到的文件名转换编码,否则中文文件名取不到文件
        String utfFileName=null;
        try {
            utfFileName=new String(fileName.getBytes("iso8859_1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return ServletActionContext.getServletContext().getResourceAsStream(utfFileName);
    }
    @Override
    public String execute() throws Exception {
        // TODO Auto-generated method stub
        return super.execute();
    }
}

struts.xml配置:

        <!-- result的type设为stream,参数inputName值与Action中的返回InputStream的方法getDownloadFile对应
            contentDisposition参数attachment代表无论何种文件,均弹出下载框,而不是用浏览器打开,
            filename指定下载时默认的文件名,通过${属性名}取action中的属性
         -->
        <action name="downloadFile2" class="com.struts2.DownloadAction2">
            <result type="stream">
                <param name="inputName">downloadFile</param>
                <param name="contentDisposition">attachment;filename=${fileName}</param>
            </result>
        </action>

测试: http://localhost:8080/struts2/downloadFile2.do?fileName=index.jsp