读者可能会觉得实现文件下载太简单了,使用一个超级链接,在链接的href属性中指定要下载的文件就可以了! 的确,这样可以实现文件下载,但是如果遇到下载的是中文文件或者是需要为下载文件设置权限时,就变得无能为力了。
一、Struts2 实现文件下载
使用Struts2框架来控制文件的下载,关键是需要配置一个stream类型的结果,需要指定下面4个属性:
1、contentType属性:指定被下载文件的文件类型。 和互联网MIME标准中的规定类型一致,如text/plain代表纯文本,text/xml代表XML,image/gif代表GIF图片,iamge/jpeg代表JPG图片
2、inputName属性: 指定被下载文件的入口输入流。 例如,下面定义的Action的下载文件输入流入口为getTargetFile()方法,所以这里要相应的指定为targetFile。
3、contentDisposition属性:指定文件下载的处理方式,包括内联(inline)和附件(attachment)两种方式,而附件方式会弹出文件保存对话框,否则浏览器会尝试直接显示文件。比如取值为:
attachment;filename="test.jpg",表示文件下载的时候保存的名字为test.jpg。如果直接写filename="test.jpg",那么默认情况是代表inline,浏览器会尝试自动打开它,等价于如下写法:inline;filename="test.jpg".
4、bufferSize属性: 指定下载文件时缓冲区大小。
配置上面4个属性,既可以在配置文件中配置,也可以在Action中设置该属性来完成配置。
二、在配置文件中指定下载资源
1、文件下载业务控制器
public class MyDownload extends ActionSupport {
/**
* @author rcy
*/
private static final long serialVersionUID = 1L;
private String inputPath;
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
//根据配置文件inputPath属性值返回一个InputStream类型值
public InputStream getTargetFile() throws Exception{
return ServletActionContext.getServletContext()
.getResourceAsStream(inputPath);
}
public String execute()throws Exception{
return SUCCESS;
}
}
<action name="download" class="download.MyDownload">
<!--指定资源下载位置 -->
<param name="inputPath">/download/xiao.jpg</param>
<!--指定success逻辑视图为一个stream类型,即流视图 -->
<result name="success" type="stream">
<!--下载文件类型 -->
<param name="contentType">iamge/jpg</param>
<!--下载文件位置 -->
<param name="inputName">targetFile</param>
<param name="contentDisposition">filename="hello.jpg"</param>
<!--缓冲区大小 -->
<param name="bufferSize">2000000</param>
</result>
</action>
三、 在Action中指定下载资源(动态指定下载资源)
1、 动态指定下载资源的业务控制器
public class Ddownload extends ActionSupport {
/**
* @author rcy
*/
private static final long serialVersionUID = 1L;
private String inputPath;// 下载文件的入口输入流
private String contentType;//文件类型
private String filename;//指定下载后的文件名
public void setInputPath(String inputPath) {
this.inputPath = inputPath;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public InputStream getTargetFile() throws Exception{
return ServletActionContext.getServletContext()
.getResourceAsStream(inputPath);
}
public String execute()throws Exception{
//调用相关业务逻辑方法,动态设置相关下载信息
inputPath="/download/xiao.jpg";
filename="test.jpg";
contentType="image/jpg";
return SUCCESS;
}
}
<action name="Ddownload" class="download.Ddownload">
<result name="success" type="stream">
<param name="contentType">${contentType}</param>
<param name="inputName">targetFile</param>
<param name="contentDisposition">filename="${filename}"</param>
<param name="bufferSize">2000000</param>
</result>
</action>
四、文件下载的权限控制
明白了Struts2框架文件下载的原理后,就很容易实现文件下载的权限控制,可以在Action的execute()方法中加入用户合法身份的验证。当然,也可以使用拦截器来实现权限的控制,在拦截器中通过检查session对象同样可以限制权限。