以下是我的配置:
struts.xml
<action name="downloadExcel" class="com.project.action.DownloadAction">
<result name="success" type="stream">
<param name="contentType">application/vnd.ms-excel</param>
<param name="contentDisposition">attachment;filename="${downloadChineseFileName}"</param>
<param name="inputName">downloadFile</param>
</result>
</action>
action:
private final static String DOWNLOADFILEPATH = SystemConfigUtil.getExportPath();
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String execute() throws Exception {
return SUCCESS;
}
public InputStream getDownloadFile() throws Exception {
return new FileInputStream(DOWNLOADFILEPATH+fileName);
//return ServletActionContext.getServletContext().getResourceAsStream("/upload/admin_1351747906109_detail_SalesReport.xls");
}//getDownloadFile()方法返回的必须是InputStream。getResourceAsStream()方法可以通过流的方式将资源输出
// 解决下载中文文件名的问题
public String getDownloadChineseFileName()
throws UnsupportedEncodingException {
return new String(fileName.getBytes(), "ISO8859-1");
}
type默认为 dispatcher。在处理文件下载的操作时,必须将type显式设置为 stream类型
stream主要向浏览器发送 InputStream对象,通常用来处理下载文件,还可用于 返回AJAX数据
接下来就需要设置 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>
即无论是什么类型的文件,哪怕是TXT,它也会弹出一个下载框,供用户选择打开或下载