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>