jsp 下载文件

本文介绍了如何在老项目(jsp+springmvc)中实现文件下载。主要涉及两种方式:一是通过a标签直接下载,二是后端返回文件流。在前端,通过a标签的href属性指向后端接口;在后端,使用Java代码读取并输出文件流,设置Content-Disposition和Content-Length响应头,实现文件下载功能。
摘要由CSDN通过智能技术生成

程序猿学社的GitHub,欢迎Star
github技术专题
本文已记录到github

前言

老项目用的jsp+springmvc框架,今天来说一说如何实现jsp下载文件。

实现思路

常见的下载有两种:

  • 第一种, 通过a标签直接下载

第一种,常见的方式是后端返回一个地址,一般使用nginx, 前端直接写具体的地址名。

  • 第二种, 后端返回文件流

前端不再是具体的地址,而是一个请求,而后端返回的是文件流

前端代码

	<tr>
											<td>${month.nickName}</td>
											<td>${month.createTime}</td>
											<td>
												<a class="changeClick layui-icon" href="${pageContext.request.contextPath}/statistics/downloadMonth?fileName=${month.fileName}" title="下载">&#xe601;</a>
											</td>
										</tr>
  • fileName为文件名
  • ${pageContext.request.contextPath}/statistics/downloadMonth 为请求的地址

后端代码

@RequestMapping("downloadMonth")
	public void  download(String fileName, HttpServletResponse response) {
		try {
			String[] split = fileName.split("_");
			if (fileName.indexOf("_") == -1) {
				return;
			}
			String yyyy = split[0];

			// path是指欲下载的文件的路径。
			File file = new File(configUtils.getReportMonthPath() + "\\" + yyyy + "\\" + fileName);
			if (!file.exists()) {
				return;
			}
			// 取得文件名。
			String filename = file.getName();
			// 取得文件的后缀名。
			String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();

			// 以流的形式下载文件。
			InputStream fis = new BufferedInputStream(
					new FileInputStream(configUtils.getReportMonthPath() + "\\" + yyyy + "\\" + fileName));
			byte[] buffer = new byte[fis.available()];
			fis.read(buffer);
			fis.close();
			// 清空response
			response.reset();
			// 设置response的Header
			response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
			response.addHeader("Content-Length", "" + file.length());
			OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
			response.setContentType("application/octet-stream");
			toClient.write(buffer);
			toClient.flush();
			toClient.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值