struts2的单文件下载

一、 导入两个jar包

  commons-fileupload-1.3.1.jar

  commons-io-2.4.jar

二、编写请求上传jsp

复制代码
<h1>文件列表--单文件</h1>
<div>
    <span>
        <img alt="" src="/imgs/${fileFileName }" width="100">
    </span>
    <a href="upload_download/download_file.action?filename=${fileFileName }">download</a>
</div>
复制代码

三、编写action

复制代码
package com.struts2.fileuplad.action;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import com.struts2.util.BaseAware;
public class FileDownloadAction extends BaseAware {
    private static final long serialVersionUID = 9084172624901427828L;
    private String filename;
    //该方法会被对应的请求action中result的参数调用
    public String getFilename() {
        return filename ;
    }
    public void setFilename(String filename) throws UnsupportedEncodingException {
        this.filename = filename;
    }
    @Override
    public String execute() {
        return SUCCESS;
    }
    //该方法被对应的请求action中result的参数调用
    //即:<param name="contentDisposition">attachment;fileName="${downloadFileName}"</param>  
    public String getDownloadFileName() throws UnsupportedEncodingException{
        //使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 
        // 构造一个新的 String,运用指定的字符集解码指定的字节数组。 
        //这里本该设置为UTF-8 但是IE依然显示乱码  换成GBK之后基本可以全部兼容了,有问题可以再修改
        return this.filename = new String(filename.getBytes("GBK"),"ISO-8859-1");
    }
    private HttpServletRequest request;
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }
    //该方法被对应的请求action中result的参数调用
    //即:<param name="inputName">inputStream</param>
    public InputStream getInputStream() throws FileNotFoundException, UnsupportedEncodingException {
            String fileapath = request.getServletContext().getInitParameter("struts2_upload_imgs_path") ;
            File file = new File(fileapath + File.separator + filename);
            FileInputStream fis = new FileInputStream(file);
        return fis;
    }
}
复制代码

四 、 配置struts.xml

复制代码
<!-- 其中主要使用的参数是:
contentType 指定下载文件的文件类型 —— application/octet-stream 表示无限制 
inputName 流对象名 —— 比如这里写inputStream,它就会自动去找Action中的getInputStream方法。 
contentDisposition 使用经过转码的文件名作为下载文件名 —— 默认格式是attachment;filename="${fileName}",将调用该Action中的getFileName方法。
                    该项目中调用的是getDownloadFileName()方法 
bufferSize 下载文件的缓冲大小 -->
<action name="download_file" class="com.struts2.fileuplad.action.FileDownloadAction">
    <result type="stream">
       <param name="contentType">application/octet-stream</param>  
       <param name="contentDisposition">attachment;fileName="${downloadFileName}"</param>  
        <param name="inputName">inputStream</param>
       <param name="bufferSize">1024</param>  
    </result>
</action>
posted @ 2015-11-05 22:42  欧文_Owen  阅读(175)  评论(0编辑  收藏  举报