虽然通过超链的href属性直接指定要下载的资源也可以实现文件下载,但遇到中文文件名、下载前的权限检查这些问题,超链都处理不了,还得Struts2来进行文件下载。采用Struts2提供的stream结果类型来支持文件下载。在stream结果类型的结果中需指定一个inputName参数,参数值指定了一个文件下载入口的输入流。废话不多说,下面分步介绍Struts2支持文件下载的过程:
1、创建一个文件下载的action,比普通action多一个返回InputStream的方法;
package com.gmi.client;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;
public class FileDownloadAction extends BaseAction {
/**
* @author xiaoxin_tang
*/
private static final long serialVersionUID = 1L;
private String inputPath;
private String contentType;
private String downFileName;
public String getInputPath() {
return inputPath;
}
public void setInputPath(String inputPath) {
try {
this.inputPath = new String(inputPath.getBytes("iso-8859-1"),"gbk");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getDownFileName() {
return downFileName;
}
public void setDownFileName(String downFileName) {
try {
this.downFileName = new String(downFileName.getBytes("iso-8859-1"),"gbk");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public InputStream getTargetFile(){
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
public String execute() throws Exception {
return SUCCESS;
}
}
其中inputPath,contentType,downFileName分别表示文件路径(待下载文件),文件类型,文件名。
2、配置action
<action name="download" class="com.gmi.client.FileDownloadAction">
<param name="inputPath">download/WebPlugin.exe</param>
<result name="success" type="stream">
<param name="contentType">${contentType}</param>
<param name="inputName">targetFile</param>
<param
name="contentDisposition">attachment;fileName="WebPlugin.exe"
</param>
<param name="bufferSize">51200</param>
</result>
</action>
最重要的是配置一个stream类型的结果,结果中的四个参数contentType,inputName,contentDisposition,bufferSize值分别是文件类型(可省.),文件下载入口的输入流(不可缺),下载后的文件名(不可省),文件大小控制(可省,一般设置大一点就行)。此外,action还需要携带一个参数inputPath,表示带下载文件的路径(相对或绝对)。
在jsp页面添加一个超链,href=“文件下载action”。至此,Struts2至此文件下载就完成了!!!
文件下载最常应用场景就是软件自动更新,用户权限下载等,此时可根据需求,在action的execute方法返回SUCCESS之前进行权限控制,版本控制等,也可用ajax实现,在此不作介绍了!