[java-ssm]单文件下载

说明:

在上传文件的时候,文件都是重命名了唯一名称保存在服务器,只有新名称保存在数据库。所以我们下载不是从数据库下载,而是从数据库找到这个文件名,从而在服务器找到这个文件并下载过来。

注意:

下载不能使用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;
}

结果:

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值