现在的位置: 首页 > 综合 > 正文

Struts2文件下载

2012年12月22日 ⁄ 综合 ⁄ 共 1986字 ⁄ 字号 评论关闭

  FileDownloadAction:这个Action负责文件的下载控制。

  Action中的fileName:接收请求传递的文件名(实际上是从页面传递过来)。

  Action中的getInputStream()方法:以流的形式读取文件,是下载文件的入口。 

package com.test.action;

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

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;


/**
 * 文件下载
 * @author Luxh
 */
public class FileDownloadAction extends ActionSupport {


    private static final long serialVersionUID = -3036349171314867490L;
    
    //文件名
    private String fileName;
    
    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) throws UnsupportedEncodingException {
        //用UTF-8重新编码文件名,解决中文乱码
        this.fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
    }
    
    public InputStream getInputStream() throws UnsupportedEncodingException, FileNotFoundException{
        HttpServletResponse response = ServletActionContext.getResponse();
        //attachment,以附件的方式下载文件,会打开保存文件对话框;inline,以内联的方式下载,浏览器会直接打开文件
        response.setHeader("Content-Disposition", "attachment;fileName="
                  + java.net.URLEncoder.encode(fileName,"UTF-8"));//java.net.URLEncoder.encode(fileName,"UTF-8")  编码转换,解决乱码
         
        //如果fileName是相对路径
        //return ServletActionContext.getServletContext().getResourceAsStream(fileName);
        //如果fileName是绝对路径
        return new FileInputStream(fileName);
    }
    
    @Override
    public String execute() throws Exception {
        return SUCCESS;
    }
    
    

}

  struts.xml配置文件:

<action name="fileDownload" class="com.test.action.FileDownloadAction">
             <result name="success" type="stream">
                  <!-- 下载文件类型定义 --> 
                  <param name="contentType">application/octet-stream</param>
                  <!-- 下载文件流定义 --> 
                  <param name="inputName">inputStream</param>
            

            <!-- 下载文件处理方式 -->
            <param name="contentDisposition">attachment;filename="${fileName}"</param>


<!-- 下载文件的缓冲大小 --> <param name="bufferSize">4096</param> </result> </action>

  jsp页面:

1  <a href="fileDownload.action?fileName=<s:property value='myfilepath'/>">文件下载</a>

  fileName的值在生成页面的时候动态生成。

  如果报inputStream流找不到的异常,需要注意文件名是相对路径还是绝对路径,用相应的方法。

 

  

  

抱歉!评论已关闭.