一般浏览器内核不同,通过超链接的方式打开文件不一定会提示下载,如超链接一张图片,浏览器自动解析该图片,而不会提示下载.因此可以将超链接指向服务器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. DBCP数据库连接打满原因分析
  2. Robot 3D Map Navigation
  3. NRF24L01+ 自动重发,自动应答BUG
  4. 【Windows7系统新特性】
  5. 2010-04-25 搞定aftr
  6. idea修改maven项目版本号
  7. c语言音像店程序,音像店管理程序_C 课程设计.pdf
  8. .NET中删除确认框的实现
  9. 表-创建表-表的转换函数
  10. [msi]获取msi安装包的ProductCode
  11. 物流的趋势和计算机科技,计算机仿真技术在物流领域的前景分析
  12. python之虚拟聊天室服务器详解
  13. 理解机器翻译模型 Transformer
  14. 恶作剧:被乔布斯整蛊也很快乐
  15. matplotlib之pyplot模块——填充多边形(fill)
  16. Kafka的消息模型
  17. 股票 价格 定价 资料收集
  18. 获吴世春章子怡投资,美丽策打造肌肤个性化护理解决方案
  19. git查看某次提交的文件列表
  20. STM32之GPIO_Mode定义和区别

热门文章

  1. GPS从入门到放弃(十) --- 定位方程解算和定位精度
  2. Win2003/XP下Intel(R) 82801DBM LPC Interface Controller - 24CC 的解决方法
  3. opengl函数总结以及算法课程复习1
  4. 小米OJ上分日志——(119)小米兔跳格子
  5. python基础教程:通过Turtle库在Python中绘制一个鼠年福鼠
  6. 动画图标,如何实现页面中图标小动画,动画按钮 CSS JS
  7. 华硕品牌机驱动存储位置
  8. 发光二极管(LED)类有哪些最新发表的毕业论文呢?
  9. 1022: 交通工具,1024: 学霸猫
  10. 不可不知的“云计算”