struts2自带有文件下载的功能。本文讲述的是,从Oracle中读取BLOB类型的文件,并转换成文件。为什么会选择把文件以BLOB类型存在数据库中呢?Boss说,这样保证了数据安全,不容易被窃取。
贴出代码:
struts2.xml文件
<!-- 简单文件下载 -->
<action>
<!-- 注意type="stream" -->
<result type="stream">
<!-- 保证文档的中文标题不乱码,必须这样做,在Java代码中是将标题转换成了ISO8859-1 -->
<param>application/x-msdownload;charset=ISO8859-1</param>
<!-- 获得的文件流 -->
<param>downloadFile</param>
<!-- 这个是获得的文件名 -->
<param>attachment;filename="${title}"</param>
<!-- 这个是输出流的大小,这里是从Java文件中获得的文件的大小 -->
<param>${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"必须要,也就是从新的页面打开这个下载链接的意思,原因是:有些浏览器下载完成后会自动关闭当前页,用户当然不会希望我下载完东西之后就把之前的页面给关闭了 -->