下载文件的两种方式:
1.超链接的方式;
2.编程实现下载;
但是通过超链接下载文件,暴露了下载文件的真实地址,不利于对资源进行安全保护;而且利用超链接下载文件,服务器端的文件只能存放在Web应用程序所在的目录下。
利用程序编码实现下载,可以增加安全访问控制,对经过授权认证的用户提供下载,还可以任意提供下载的数据,我们可以将文件放到Web应用程序以外的目录中,也可以将文件保存到数据库中。此处实现的方式是利用编程的方式:需要按照如下的方式设置三个报头域就可以了:
Content-Type:application/x-msdownload
Content-Disposition:attachment;filename=downloadfile
Content-Length:filesize
使用Struts2具体实现:
浏览器在接收到上述的报头信息后, 就会弹出文件下载对话框,让你将文件保存到本地硬盘。
Struts2通过org.apache.struts2.dispatcher.StreamResult结果类型来支持文件下载,使得原本编写就简单的下载程序变得更加简单了。
StreamResult结果类型利用HttpServletResponse对象返回的ServletOutputStream对象向客户端输出下载文件的二进制数据,它有下列参数:
contentType:发送给Web浏览器的数据流的MIME类型(默认是text/plain),即下载文件内容类型
contentLength:数据流的长度,以字节为单位(浏览器显示一个进度栏),即下载文件的长度。
contentDisposition:用于控制文件下载的一些信息,可选择的设置包括:inline;filename=“下载文件名”和attachment;filename=“下载文件名”,filename指定下载的文件名。Inline表示下载文件在本页面内部打开,attachement表示弹出”文件下载”对话框。不过,这也不是绝对的,对于浏览器能够显示的下载文件是这样的,对于浏览器不支持的下载类型,即使使用inline选项,仍然会弹出”文件下载”对话框。 contentDisposition的默认值是inline.
inputName:Action中用来下载文件的属性的名字,该属性的类型是InputStream.默认值是inputStream.
bufferSize:文件数据从输入复制到输出的缓冲区的大小,默认为1024字节。
具体实现的实例:
struts.xml配置
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="fileDownAction" class="com.handler.FileDownAction" method="down">
<result type="stream">
<param name="contentType">application/x-msdownload</param>//设置抱头信息
<param name="inputName">inputStream</param>
<param name="contentDisposition">attachment;filename="${filename}"</param>//attachement表示弹出”文件下载”对话框
<param name="bufferSize">1024000</param>
</result>
</action>
</package>
</struts>
Action域:
package com.handler;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class FileDownAction extends ActionSupport{
private String filename;
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
private InputStream inputStream;
public InputStream getInputStream() throws FileNotFoundException {
String path=ServletActionContext.getServletContext().getRealPath("/files/"+filename);
File file=new File(path);
inputStream =new FileInputStream(file);
return inputStream;
}
public String down(){
return SUCCESS;
}
}
运行结果: