利用struts2实现文件的下载

来源:互联网 发布:esp01单片机 编辑:程序博客网 时间:2024/03/29 17:31

下载文件的两种方式:

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; }}
运行结果:


原创粉丝点击