struts2文件下载(文件保存在数据库中)

   struts2自带有文件下载的功能。本文讲述的是,从Oracle中读取BLOB类型的文件,并转换成文件。为什么会选择把文件以BLOB类型存在数据库中呢?Boss说,这样保证了数据安全,不容易被窃取。

   贴出代码:

struts2.xml文件

<!-- 简单文件下载 --> 
<action name="download" class="web.DownloadAction"> 
        <!-- 注意type="stream" -->
	<result name="success" type="stream"> 
	    <!-- 保证文档的中文标题不乱码,必须这样做,在Java代码中是将标题转换成了ISO8859-1 -->
	    <param name="contentType">application/x-msdownload;charset=ISO8859-1</param> 
	    <!-- 获得的文件流 -->
	    <param name="inputName">downloadFile</param> 
	    <!-- 这个是获得的文件名 -->
	    <param name="contentDisposition">p_w_upload;filename="${title}"</param> 
	    <!-- 这个是输出流的大小,这里是从Java文件中获得的文件的大小 -->
	    <param name="bufferSize">${size}</param> 
	</result> 
</action>

DownloadAction.java

private int id;
private String title;
private int size;
ResultDao rDao = new ResultDao();
// 根据id,从数据库获取指定的文件
public InputStream getDownloadFile() throws Exception {
        // 获取文件流
	return new ByteArrayInputStream(rDao.findFileById(id)); 
}
public String execute() throws Exception {
	Result r = rDao.findResultById(id);

	title = new String(r.getTitle().getBytes(), "ISO8859-1");// 从数据库中获取文件的标题
	size = getDownloadFile().available();// 获取文件的大小
	return SUCCESS;
}
public void setTitle(String title) {
	this.title = title;
}
public void setSize(int size) {
	this.size = size;
}
public void setId(int id) {
	this.id = id;
}

前台jsp代码

<!-- 需要传指定的id -->
<a href="download.action?id=<s:property value="#r.id" />" target="_blank">下载资料</a>
<!-- target="_blank"必须要,也就是从新的页面打开这个下载链接的意思,原因是:有些浏览器下载完成后会自动关闭当前页,用户当然不会希望我下载完东西之后就把之前的页面给关闭了 -->