一般浏览器内核不同,通过超链接的方式打开文件不一定会提示下载,如超链接一张图片,浏览器自动解析该图片,而不会提示下载.因此可以将超链接指向服务器Servlet,让Servlet来完成

先写一个静态HTML

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<a href="\91tangteacher\DownloadServlet?filename=黄图.jpg">高清黄图</a>
<script>var element = document.getElementsByTagName("a")[0];//http协议由国外定义,不支持中文,因此地址中有中文需要用某种方式转码element.href=encodeURI(element.href);//使用js中的encodeURI方法将a标签的herf属性编码
</script>
</body>
</html>

DownloadServlet类

package com.creat.test;import com.creat.Utils.DownLoadUtils;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String filename = request.getParameter("filename");//获取请求下载的文件名String decodefilename = URLDecoder.decode(filename, "utf-8");//java中相同编解码规则对应的类为URLencode和URLdecode//这里使用URLDecoder类静态方法decode对文件名解码(请求路径中中文已被编码)ServletContext servletContext = getServletContext();//获取服务器域对象String mimeType = servletContext.getMimeType(decodefilename);//获取传输文件类型(一般文件在传输时有对应的类型,web.xml配置文件中列举了所有对应关系)response.setHeader("Content-Type",mimeType);//设置传输文件类型String agent = request.getHeader("User-Agent");//获取请求的浏览器类型String encodefilename = DownLoadUtils.getFileName(agent, decodefilename);//下载弹窗中文文件名会乱码,这里使用特殊方式编码response.setHeader("Content-Disposition","attachment;filename="+encodefilename);//设置客户端浏览器对文件以附件处理String realPath = servletContext.getRealPath("/"+decodefilename);//域对象获取文件真实路径FileInputStream inputStream=new FileInputStream(realPath);//创建输入流,加载要下载的文件进内存ServletOutputStream outputStream = response.getOutputStream();//创建输出流,写文件给客户端浏览器byte[]bys=new byte[1024*4];int len;while ((len=inputStream.read(bys))!=-1){outputStream.write(bys,0,len);}inputStream.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

点击HTML的链接,自动请求DownloadServlet完成下载

演示
点击高清黄图,自动弹出下载对话框.

下载完成

上面使用到的DownLoadUtils 工具类代码

package com.ithema.Utils;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Base64;public class DownLoadUtils {/**** @param agent User-Agent 请求头头信息,浏览器类型* @param filename  原始中文文件名  九尾.jpg* @return 转码之后的非中文字符串* @throws UnsupportedEncodingException*/public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("MSIE")) {// IE浏览器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐浏览器Base64.Encoder encoder = Base64.getEncoder();filename = "=?utf-8?B?" + encoder.encodeToString(filename.getBytes("utf-8")) + "?=";} else {// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}System.out.println(filename);return filename;}
}

Servlet文件下载实例详解相关推荐

  1. Servlet文件下载例子详解及response的contentType类型大全

    一.Servlet文件下载例子. 以下例子为实现文件下载的工具方法, package com.avcon.utils;import java.io.File; import java.io.FileI ...

  2. android文件下载功能实现,Android中DownloadManager实现文件下载实例详解

    Android中DownloadManager实现文件下载 下载 创建下载链接 DownloadManager.Request request = new DownloadManager.Reques ...

  3. java servlet init方法_JSP开发Servlet重写init()方法实例详解

    jsp开发servlet重写init()方法实例详解 写一个servlet时,有时需要我们重写该servlet的初始化方法,然后,究竟是重写init(servletconfig config),还是重 ...

  4. java 控制jsp_JSP学习之Java Web中的安全控制实例详解

    普通用户界面 修改登录的Servlet,修改后的代码如下: LoginProcess.java代码: package servlet; import javabean.User; import jav ...

  5. java request获取域,Java Web - Servlet(13)HttpServletRequest详解(获取请求数据、请求分派、请求域)(二)...

    Java Web -- Servlet(13)HttpServletRequest详解(获取请求数据.请求分派.请求域)(2) HttpServletRequest ----------------- ...

  6. 基于Servlet3.0的编程式SpringMVC实例详解

    传统的SpringMVC应用都是基于web.xml配置的,首先使用context listener启动Spring上下文,再配置一个DispatcherServlet启动一个WebApplicatio ...

  7. java web初始化实例_Struts2中实现web应用的初始化实例详解

    Struts2中实现web应用的初始化实例详解 在JavsSE中,main方法为应用提供了入口,而在Android中,我们可以使用Application对于整个应用的生命周期进行管理,那么在基于Str ...

  8. php 获取手机特征码,【新人学习】按键精灵获取数字特征码实例详解

    按键精灵获取数字特征码实例详解 运行环境:分辨率:1440x900 色深:32位 操作系统:Windows XP 按键精灵版本:7.00.3730 @兄弟工程师01未评2009/3/19//做这东西主 ...

  9. java控制excel_利用Java控制EXCEL实例详解

    利用Java控制EXCEL实例详解发布者:本站     时间:2020-05-06 15:05:43 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵 ...

最新文章

  1. leetcode-521-Longest Uncommon Subsequence I
  2. go语言csv包_golang 写入 csv 文件
  3. python错误-Python错误解决
  4. 并发编程——进程——理论知识
  5. Spring Boot:构建一个RESTful Web应用程序
  6. rsync同步时,删除目标目录比源目录多余文件的方法(--delete)
  7. 视频编码中为什么须要进行变换编码?
  8. 吴恩达神经网络和深度学习-学习笔记-39-计算机视觉现状
  9. Spring整合MyBatis原理之MapperScannerConfigurer(一)
  10. ENSP端口角色和状态
  11. 绝对地址、相对地址、/、./、../之间的区别
  12. Android本应用数据清除管理器
  13. js事件冒泡与事件捕获、阻止事件冒泡和浏览器默认行为
  14. 【高新技术企业】高企申报材料以及要求
  15. 第22章 迈向Spring MVC的旅程
  16. uiuc的计算机工程硕士学费标准,美国计算机硕士留学费用全都在这了!
  17. 网络环境切换,会导致虚拟机网络地址更换
  18. 单点登陆是什么意思?
  19. 2019年3月计算机科学ESI排名,2019年3月ESI中国大学综合排名百强出炉,88所院校有进步...
  20. 休闲阅读——《只是为了好玩:Linux之父林纳斯自传》

热门文章

  1. 你应当如何学习C++(以及编程)
  2. 网络基础知识,基础拓扑结构,基础设计理念总结
  3. Alien Skin Exposure X7最新2022好用的ps滤镜插件
  4. 机房监控系统发展趋势
  5. 【致远FAQ】升级问题之部署日志说明
  6. 网络创业成功五要素.doc
  7. 研究生写脚本抢HPV九价疫苗:被采取强制措施,后果严重
  8. 智慧旅游——旅游业的第二次革命
  9. 微信转发软件后缀_APP分享文件给微信好友
  10. web管理员登录页面