下载文件的两种方式:
1.超链接的方式;
2.编程实现下载;
但是通过超链接下载文件,暴露了下载文件的真实地址,不利于对资源进行安全保护;而且利用超链接下载文件,服务器端的文件只能存放在Web应用程序所在的目录下。
利用程序编码实现下载,可以增加安全访问控制,对经过授权认证的用户提供下载,还可以任意提供下载的数据,我们可以将文件放到Web应用程序以外的目录中,也可以将文件保存到数据库中。此处实现的方式是利用编程的方式: 需要按照如下的方式设置三个报头域就可以了: Content-Type:application/x-msdownload Content-Disposition:attachment;filename=downloadfileContent-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; } } 运行结果: