8.struts2的文件的下载

下载action的简单写法

package edu.yzu.action;

import java.io.InputStream;

import java.io.UnsupportedEncodingException;

 

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")

public class DownloadAction extends ActionSupport {

    //接收传递过来的下载文件的名称,如:download.do?filename=杰克.doc

    private String filename;

    public String getFilename() {

        return filename;

    }

    public void setFilename(String filename) {

        try {

            //下面的很重,Tomcat会自动为所有的url请求中的参数进行编码,默认为ISO8859-1

            //这个编码当在在Tomcat配置中用进行更改

            //第二个编码utf-8为页面使用的编码

            this.filename = new String(filename.getBytes("ISO8859-1"),"utf-8");

        } catch (UnsupportedEncodingException e) {

            this.filename="download"+filename.substring(filename.lastIndexOf("."));

        }

    }

    // 这个方法必须要有,struts会跟据配置文件找到此方法,得到要下载的流

    public InputStream getInputStream() {

        return ServletActionContext.getServletContext().getResourceAsStream(

                "/"+filename);

    }

//这个方法要有,struts会跟据配置调用此方法,动态确定下载文件的名称,

    public String getDownloadFileName() throws UnsupportedEncodingException {

        //这个设置也很重要,gbk为开发平台使用的编码,可以不设置,则使用getBytes(),这个方法自动

        //使用开发平台编码

        //第二个编码还是为Tomcat为url设置的默认编码。

        return new String(filename.getBytes("gbk"),"ISO8859-1");

    }

    @Override

    public String execute() throws Exception {

        return SUCCESS;

    }

    //调用此方法可以动态指定下载文件的类型

    public String getContentType()

    {

        return "application/msword";

    }

}

 

下载的配置

<action name="download" class="edu.yzu.action.DownloadAction">

<!-- 下载文件时的result类型必须为stream,struts会向客户端写入流,对方识别后进行文件下载

,它的一此参数来自于流的实现类,可以在struts-default.xml中找到

 -->

<result name="success" type="stream">

<!-- 下载文件的类型,及此协议发送时的编码 -->

<param name="contentType">${contentType}</param>

<!-- 为下载文件指定名称,这些是http协议的规定,照办就好了。

${downloadFileName} struts会自动调用action里面的getDownloadFileName的方法,确定下载文件名,

同理,文件的类型也一样动态的给定(如上),这对下载很有用。

attachment表示以附件类型打开,即会在客户端弹出一个保存对话框,还有一种为inline,即会在浏览器内打开。

但是经过测试,这一个属性好像没有什么作用,无论哪种配置都是以弹出对话框的形式

 -->

<param name="contentDisposition">inline;filename="${downloadFileName}"</param>

<!-- struts会跟据下面的配置找到下载文件的流 -->

<param name="inputName">inputStream</param>

</result>

</action>

posted @ 2010-05-03 17:03  沉兮  阅读(419)  评论(0编辑  收藏  举报