jsp中实现文件下载的最简单的方式是在网页上做超级链接,如: href= “music/abc.mp3”点击下载。但是这样服务器上的目录资源会直接暴露给最终用户,会给网站带来一些不安全的因素。因此可以采用其它方式实现下载,可以采用:1、RequestDispatcher的方式进行;2、采用文件流输出的方式下载。 
1、采用RequestDispatcher的方式进行:

<% response.setContentType("application/x-download");//设置为下载application/x-download String filedownload = "/要下载的文件名";//即将下载的文件的相对路径 String filedisplay = "最终要显示给用户的保存文件名";//下载文件时显示的文件保存名称 filenamedisplay = URLEncoder.encode(filedisplay,"UTF-8"); response.addHeader("Content-Disposition","attachment;filename=" + filedisplay); try { RequestDispatcher dis = application.getRequestDispatcher(filedownload); if(dis!= null) { dis.forward(request,response); } response.flushBuffer(); } catch(Exception e) { e.printStackTrace(); } finally { }
%>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

2、采用文件流输出的方式下载

<%@ page import="java.io.OutputStream" %>
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page language="java" contentType="application/x-msdownload" pageEncoding="UTF-8" %>
<%//关于文件下载时采用文件流输出的方式处理:String bath = request.getSession().getServletContext().getRealPath("");response.setContentType("application/x-download");String fileDownloadName = bath + request.getParameter("fileDownloadName"); // 下载的文件的物理路径+文件名String fileDisplayName = String.valueOf(System.currentTimeMillis())+fileDownloadName.substring(fileDownloadName.lastIndexOf("."),fileDownloadName.length()); // 给用户提供的下载文件名fileDisplayName = URLEncoder.encode(fileDisplayName, "UTF-8");response.addHeader("Content-Disposition", "attachment;filename=" + fileDisplayName);OutputStream outp = null;FileInputStream in = null;try {outp = response.getOutputStream();in = new FileInputStream(fileDownloadName);byte[] b = new byte[1024];int i = 0;while ((i = in.read(b)) > 0) {outp.write(b, 0, i);}outp.flush();} catch (Exception e) {System.out.println("文件下载失败!");e.printStackTrace();} finally {if (in != null) {in.close();in = null;}if (outp != null) {outp.close();outp = null;out.clear();out = pageContext.pushBody();}}
%>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

对于第二种方法,我认为应该是比较常用的。不过有几个地方是值得我们注意的:

一、采用第二种方法的主要优点是实际文件的存放路径对客户端来说是透明的。 
这个文件可以存在于任何你的服务器能够取得到的地方,而客户端不一定能直接得到。例如文件来自于数据库或者内部网络的一个FTP服务器。还句话说,这种方式可以实现隐藏实际文件的URL地址。

二、为了防止客户端浏览器直接打开目标文件(例如在装了MS Office套件的Windows中的IE浏览器可能就会直接在IE浏览器中打开你想下载的doc或者xls文件),你必须在响应头里加入强制下载的MIME类型: 
response.setContentType(“application/force-download”);//设置为下载application/force-download 
这样,就可以保证在用户点击下载链接的时候浏览器一定会弹出提示窗口来询问你是下载还是直接打开并允许你选择要打开的应用程序,除非你设置了浏览器的一些默认行为。 
或者,你想让客户端自行处理各种不同的文件类型,你可以在服务器的配置文件中配置MIME类型映射,通过简单的判断文件后缀名来处理。例如,在Tomcat中设置MIME响应类型: 
如果文件在客户端中的响应程序类型和期望不一致,修改$TOMCAT_HOME\conf\web.xml文件中的如下部分 :

zip 
application/zip

mht 
message/rfc822

……

三、在响应头中尽量不要设置浏览器缓存期限。 
有时候用户在点击了下载链接后,在弹出窗口中,用户想直接点击“打开”,而不想保存到指定路径。这时候如果我们在响应头中限制了不允许使用浏览器缓存(即总是刷新),在IE浏览器中我们将无法直接打开该文件。因为限制了不允许使用缓存,浏览器无法将文件保存到临时文件夹(即缓存)。 
也就是说,在响应头中不要进行如下的设置(已注释): 
//response.addHeader(“pragma”,”NO-cache”); 
//response.addHeader(“Cache-Control”,”no-cache”); 
//response.addDateHeader(“Expries”,0);

四、文件名为中文或其他unicode字符时的处理。 
有时候提供下载的文件名中包含中文字符或者其他unicode字符,会导致浏览器无法正确的采用默认的文件名保存文件。我们应该记住在响应头中包含filename字段并采用ISO8859-1编码(推荐)或者采用UTF-8编码: 
response.setHeader(“Content-disposition”,”attachment; filename=”+new String(filename.getBytes(“UTF-8”),”iso8859-1”)); //采用ISO8859-1编码 
response.setHeader(“Content-disposition”,”attachment; filename=”+URLEncoder.encode(filename, “UTF-8”)); //采用UTF-8编码 
但是,这种方式在不同的浏览器中表现也有所不同。例如在IE和Firefox中,采用ISO8859-1编码可以正确显示文件名,而在Opera中不管采用那种编码,默认保存的文件名都无法做到正确显示。 
所以最好的方法其实就是尽量在文件名中使用ascii编码。

五、由于采用流的方式进行输入输出,我们必须保证在使用完毕后关闭流的资源。

jsp页面链接下载文件相关推荐

  1. HTML a链接下载文件之图片,文件,乱码等问题

    我们在做需求的时候,经常会遇到下载文件 前端下载文件一般分为两种方式: 使用 a 链接进行下载: <a herf="url" >下载</a> 向后端发送请求 ...

  2. Python 从 Excel 读取链接下载文件

    Python 从 Excel 读取链接下载文件 import os from urllib.parse import urljoin, quote, unquoteimport requests im ...

  3. 前端通过url链接下载文件

    前端通过url链接下载文件 网上找到几个相关的方法,如下 // 方法一: const form = document.createElement('form'); form.setAttribute( ...

  4. H5页面实现下载文件兼容移动端

    H5页面实现下载文件兼容移动端 问题1:之前写的H5 blob方式下载 主要是以后台返回文件流的方式进行下载 pc端没有问题 发现有些手机不支持 移动端的下载的方式改成通过文件Url直接下载或打开 但 ...

  5. 【java从网络外链接下载文件并回传到其他网络服务器】

    java从网络外链接下载文件并回传到其他网络服务器 场景 描述 举例 解决方案 准备 例子 说明,如果是springboot项目 测试 其他更细粒度实现的文件上传至远程(网络)服务器例子 场景 描述 ...

  6. 如何在JSP页面实现Word文件的预览

    前段时间做了自己的毕业设计,涉及到了Word文件的预览问题,百度谷歌了一遍,最终选择了利用卓正的PageOffice插件来实现.PageOffice插件对Office系列的文件在网页中预览的支持还是挺 ...

  7. 使用JSP从服务器下载文件的示例

    在此示例中,我们将下载jsp文件.但是您可以下载任何文件.要从服务器下载文件,应指定名为APPLICATION / OCTET-STREAM的内容类型. index.jsp 该文件提供了下载jsp文件 ...

  8. IE访问HTTPS链接下载文件,IE提示无法下载

    今天的确在客户现场碰到同样错误,我的开发机是win7+IE9,没有任何问题,但客户全部是IE8,都打开出错.由于本地重现不了问题,弄了半天无法解决,束手无策只好求助网络,根据此贴解决了这个问题. 此问 ...

  9. vue点击url链接下载文件

    在src下面新建一个downLoadUrl的目录 downLoadUrl / index.js文件 /** 后端返回文件的url,前端创建a标签来下载** 1. 解决了若文件为图片或浏览器支持的格式类 ...

最新文章

  1. Git -- 基本操作 之 版本回退
  2. mysql根据叶子找父亲_MySQL:如何在特定节点中查找叶子
  3. 关于数论【康托展开及其逆运算】
  4. SpringBatch适配器详解
  5. css3盒模型:IE6混杂模式下的盒模型
  6. 【测试点分析】1104 Sum of Number Segments (20 分)
  7. SAP Spartacus Reference App Structure
  8. ios 请求失败封装_vue_axios请求封装、异常拦截统一处理
  9. 大学计算机课的学后感,大学课程学习心得体会感想
  10. 计算机视觉应用开发功能图,《计算机视觉算法:基于OpenCV的计算机应用开发》 —1.3 理解计算机图像...
  11. 中秋佳节--理解Enum枚举
  12. 再谈shell之“/dev/null 21”
  13. 你都用python来做什么-你都用 Python 来做什么?
  14. iOS即时通讯之CocoaAsyncSocket源码解析五
  15. bzoj 1503: [NOI2004]郁闷的出纳员 (splay)
  16. Atitit.自定义存储引擎的接口设计 api 标准化 attilax 总结  mysql
  17. mac 批量更改文件后缀名
  18. 于娟视频:活着就是王道
  19. 了解java集合框架
  20. LabVIEW FPGA PCIe开发讲解-7.2节:目前主流的4大Xilinx FPGA PCIe DMA通信IP核讲解

热门文章

  1. 【渝粤题库】国家开放大学2021春1054流通概论题目
  2. 8. Android MultiMedia框架完全解析 - prepareAsync的过程分析
  3. sqlserver加上百分号_用一条sql语句显示数据百分比并加百分号
  4. springboot 事件监听器
  5. move_base导航框架中recovery_behaviors
  6. 电子面单怎么申请-JAVA/PHP
  7. Unity 获取鼠标点击图片时 获取点击位置的像素
  8. mtk平台androidl usb uvc camera 调试记录
  9. ad被锁定的账户_大量AD域帐号自动被锁定
  10. mac安装WireShark2.0新手教程