说明:
在上传文件的时候,文件都是重命名了唯一名称保存在服务器,只有新名称保存在数据库。所以我们下载不是从数据库下载,而是从数据库找到这个文件名,从而在服务器找到这个文件并下载过来。
注意:
下载不能使用ajax,要么使用表单,要么在js使用 window.location.href。后者缺点是只能支持get提交。
jsp代码如下:
下载的a标签里的属性实际上是通过属性thisid存有该下载文件在数据库的id的,到时候下载需要通过该id去数据库去找它的文件名。
<tbody>
<c:forEach items="${standardList}" var="standard">
<tr>
<td><input type="checkbox" name="num" /></td>
<td>${standard.std_num}</td>
<td>${standard.zhname}</td>
<td>${standard.version}</td>
<td><fmt:formatDate value="${standard.release_date}" pattern="yyyy-MM-dd" /></td>
<td><fmt:formatDate value="${standard.impl_date}" pattern="yyyy-MM-dd" /></td>
<td>
<a href="javascript:void(0)" class="down" thisid="${standard.id}">下载</a>
<a href="updateStandardMgr.html?id=${standard.id}">修改</a>
</td>
</tr>
</c:forEach>
</tbody>
js代码如下:
我选择的是用window.location.href来提交,这种方式只支持get提交方式。如果有重要数据,为确保安全性,请换成表单提交并选择post提交方式。
// 点击"下载"时
$("tbody").on("click", ".down", function() {
if (confirm("确定要下载吗?")) {
var id = $(this).attr("thisid");
window.location.href = "dowm.html?id=" + id;
}
});
controller代码如下:
@RequestMapping(value = "dowm.html")
public void dowm(@RequestParam(required = true) Integer id, HttpServletRequest request, HttpServletResponse response) throws Exception {
// 根据id从数据库取得文件名fileName
Standard standard = standardBiz.findById(id);
String fileName = standard.getPackage_path();
// 上传时文件就放在这个目录下,所以我们下载也要选择这个目录
String serverPath = request.getServletContext().getRealPath("statics" + File.separator + "uploadfiles");
// 指定文件的全路径+文件名
String path = serverPath + File.separator + fileName;
File file = new File(path);
if (!file.exists()) {//服务器找不到该文件时
System.out.println("找不到文件");
return;
}
// 下载的文件名字就叫"下载文件"。中文要转码,免得文件名中文乱码。
StringBuilder filename = new StringBuilder(new String("下载文件".getBytes("utf-8"), "iso-8859-1"));
// 给文件名拼接后缀
String prefix = FilenameUtils.getExtension(fileName);// 根据原文件名获取后缀名
filename.append(".").append(prefix);
// 设置文件下载头
response.addHeader("Content-Disposition", "attachment;filename=" + filename);
// 设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("multipart/form-data");
// 读取要下载的文件,保存到文件输入流
FileInputStream in = new FileInputStream(path);
// 创建输出流
OutputStream out = response.getOutputStream();
// 创建缓冲区
byte buffer[] = new byte[1024];
int len = 0;
// 循环将输入流中的内容读取到缓冲区当中
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
// 关闭文件输入流
if (in != null) {
in.close();
}
// 关闭输出流
if (out != null) {
out.flush();
out.close();
}
return;
}
结果: