简单实例
1、首先定义Action类,在WebConent目录下,新建download文件夹,放入测试aaa.txt文件
public class DownloadAction extends ActionSupport {
public InputStream getDownloadFile() {
return ServletActionContext.getServletContext().getResourceAsStream(
"/download/aaa.txt");
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
2、配置struts.xml文件
<action name="downloadFile" class="cn.sict.download.DownloadAction">
<result type="stream">
<!-- 加上attachment以后,无论是不是文本文件,都下载保存 -->
<param name="contentDisposition">attachment;filename="aaa.txt"</param>
<param name="inputName">downloadFile</param><!-- 与action类中的getDownloadFile是对应的 -->
</result>
</action>
3、在jsp页面定义下载链接
<a href="downloadFile.action">下载文件</a>
xml文件分析
1、type默认为dispatcher。在处理文件下载的操作时,必须将type显式设置为stream类型,stream主要向浏览器发送InputStream对象,通常用来处理下载文件,还可用于返回AJAX数据
2、接下来就需要设置StreamResult类的三个重要的属性:
contentType属性用来指定下载文件的类型,同样可以在Tomcat6.0.20//conf//web.xml文件中查看MIME Type Mappings。
contentDisposition属性用来设定显示的文件名,这是在点击下载链接时显示在提示框中的文件名同时它的值的filename=" "所设定的name值也是下载到本地之后的文件的名字并且它的写法是固定的filename=" ",这是由HTTP协议所规范的。
inputName属性的值需严格遵守JavaBean规范,它对应着Action中返回inputStream的方法名。假设inputName设为downFile,则Action中必定有一个返回inputStream的getDownFile()方法。
另外contentDisposition属性可以设定两个值,它的第一个值用来设定文件打开方式,默认的是inline即在浏览器中打开,也可设定attachment,如<param name="contentDisposition">attachment;filename="Struts2.ppt"</param>
实例修改,下载文件提示框中的文件名实现动态修改
在下载文件提示框中的文件名是来自struts.xml中filename的属性配置,如果写死,就没有办法与实际下载的文件名一一对应。
1、编写Action类
public class DownloadAction1 extends ActionSupport{
private int number;
private String filename;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public InputStream getDownloadFile()
{
if(1==number)
{ this.filename="aaa.txt";
return ServletActionContext.getServletContext().getResourceAsStream(
"/download/aaa.txt");
}else
{ this.filename="bbb.txt";
return ServletActionContext.getServletContext().getResourceAsStream(
"/download/bbb.txt");
}
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
如果下载的文件是中文名的,可能出现乱码问题,需要再this.file=“xxx”的后面,加上this.filename=new String(this.filename.getBytes("gbk"),"8859_1");字符转换
2、配置struts.xml文件
<action name="downloadFile" class="cn.sict.download.DownloadAction1">
<result type="stream">
<!-- 加上attachment以后,无论是不是文本文件,都下载保存 -->
<param name="contentDisposition">attachment;filename=${filename}</param>
<param name="inputName">downloadFile</param><!-- 与action类中的getDownloadFile是对应的 -->
</result>
</action>
3、页面下载链接测试
<a href="downloadFile.action?number=1">下载文件</a>