[转]【HttpServlet】HttpServletResponse接口 案例:完成文件下载
创建时间:6.19 & 6.24
1.案例-完成文件下载
1) 什么情况下会文件下载?
浏览器不能解析的文件就下载
*使用a标签直接指向服务器上的资源
2)什么情况下需要在服务端编写文件下载的代码?
理论上,浏览器可以解析的代码需要编写文件下载代码
实际开发中,只要是下载的文件都编写文件下载代码
文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。所以文件下载需要IO技术将服务器端的文件使用InputStream读取到,在使用 ServletOutputStream写到response缓冲区中
代码如下:
上述代码可以将图片从服务器端传输到浏览器,但浏览器直接解析图片显示在页面上,而不是提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方式。
1)告知浏览器文件的类型:response.setContentType(文件的MIME类型);
2)告示浏览器文件的打开方式是下载:
response.setHeader("Content-Disposition","attachment;filename=文件名称");
代码如下:
*客户端不是根据文件扩展名来区分文件的类型,而是通过文件的MIME类型(在tomcat的web.xml中对extension进行MIME的映射)
但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容 性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一个属性可以辨别
解决乱码方法如下(不要记忆--了解):
其中agent就是请求头User-Agent的值
1 if (agent.contains("MSIE")) { 2 3 // IE浏览器 4 5 filename = URLEncoder.encode(filename, "utf-8"); 6 7 filename = filename.replace("+", " "); 8 9 } else if (agent.contains("Firefox")) { 10 11 // 火狐浏览器 12 13 BASE64Encoder base64Encoder = new BASE64Encoder(); 14 15 filename = "=?utf-8?B?" 16 17 + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; 18 19 } else { 20 21 // 其它浏览器 22 23 filename = URLEncoder.encode(filename, "utf-8"); 24 25 }
完整代码:见WEB14代码DownloadServlet2.java
1 package com.itheima.content; 2 3 4 5 import java.io.FileInputStream; 6 7 import java.io.IOException; 8 9 import java.io.InputStream; 10 11 import java.net.URLEncoder; 12 13 14 15 import javax.servlet.ServletException; 16 17 import javax.servlet.ServletOutputStream; 18 19 import javax.servlet.http.HttpServlet; 20 21 import javax.servlet.http.HttpServletRequest; 22 23 import javax.servlet.http.HttpServletResponse; 24 25 26 27 import sun.misc.BASE64Encoder; 28 29 30 31 public class DownLoadServlet2 extends HttpServlet { 32 33 34 35 protected void doGet(HttpServletRequest request, HttpServletResponse response) 36 37 throws ServletException, IOException { 38 39 40 41 //*******文件名称是中文的下载******* 42 43 44 45 46 47 //获得要下载的文件的名称 48 49 String filename = request.getParameter("filename");//????.jpg 50 51 //解决获得中文参数的乱码----下节课讲 52 53 filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//美女.jpg 54 55 56 57 58 59 //获得请求头中的User-Agent 60 61 String agent = request.getHeader("User-Agent"); 62 63 //根据不同浏览器进行不同的编码 64 65 String filenameEncoder = ""; 66 67 if (agent.contains("MSIE")) { 68 69 // IE浏览器 70 71 filenameEncoder = URLEncoder.encode(filename, "utf-8"); 72 73 filenameEncoder = filenameEncoder.replace("+", " "); 74 75 } else if (agent.contains("Firefox")) { 76 77 // 火狐浏览器 78 79 BASE64Encoder base64Encoder = new BASE64Encoder(); 80 81 filenameEncoder = "=?utf-8?B?" 82 83 + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; 84 85 } else { 86 87 // 其它浏览器 88 89 filenameEncoder = URLEncoder.encode(filename, "utf-8"); 90 91 } 92 93 94 95 96 97 98 99 //要下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型 100 101 response.setContentType(this.getServletContext().getMimeType(filename)); 102 103 //告诉客户端该文件不是直接解析 而是以附件形式打开(下载)----filename="+filename 客户端默认对名字进行解码 104 105 response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder); 106 107 108 109 //获取文件的绝对路径 110 111 String path = this.getServletContext().getRealPath("download/"+filename); 112 113 //获得该文件的输入流 114 115 InputStream in = new FileInputStream(path); 116 117 //获得输出流---通过response获得的输出流 用于向客户端写内容 118 119 ServletOutputStream out = response.getOutputStream(); 120 121 //文件拷贝的模板代码 122 123 int len = 0; 124 125 byte[] buffer = new byte[1024]; 126 127 while((len=in.read(buffer))>0){ 128 129 out.write(buffer, 0, len); 130 131 } 132 133 134 135 in.close(); 136 137 //out.close(); 138 139 140 141 } 142 143 144 145 protected void doPost(HttpServletRequest request, HttpServletResponse response) 146 147 throws ServletException, IOException { 148 149 doGet(request, response); 150 151 } 152 153 }
response细节点:
1)response获得的流不需要手动关闭,web容器(tomcat)会帮助我们关闭
2)getWriter和getOutputStream不能同时调用
验证码案例:不用掌握生成验证码,只要掌握html页面里怎么改
转载于:https://www.cnblogs.com/musecho/p/11202097.html
[转]【HttpServlet】HttpServletResponse接口 案例:完成文件下载相关推荐
- 服务器响应的生成:HTTP响应报头——HttpServletResponse接口的应用
一,响应报头 响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息 常用的响应报头 Location Content-T ...
- 【零基础学Java】—笔记本USB接口案例(二十八)
[零基础学Java]-笔记本USB接口案例(二十八) 一.笔记本电脑 笔记本电脑(laptop)通常具备使用USB设备的功能,在生产时,笔记本都预留了可以插入USB设备的USB接口,但具体什么是USB ...
- javax.servlet.http.HttpServletResponse接口(HTTP版本)
< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> HttpServletR ...
- rest接口案例_REST和平:微服务与现实案例中的整体
rest接口案例 by RDX 由RDX REST和平:微服务与现实案例中的整体 (REST in Peace: Microservices vs monoliths in real-life exa ...
- 185-186 抽象类+接口案例/运动员和教练
185-186 抽象类+接口案例/运动员和教练 需求:有乒乓球运动员.篮球运动员.乒乓球教练.篮球教练.签了出过交流,乒乓球教练.乒乓球运动员需要学习英语.请用所学知识分析,这个案例中有哪些具体类.哪 ...
- 51单片机控制系统的人机交互接口设计【51单片机与LED数码管的动态显示接口案例分析】
本章节利用Keil uVision5和ISIS 7 Professional两个软件来进行仿真实验. [例]运用51单片机实现8位8段数码管的动态显示,LED数码管的段选数据由51单片机的P0口控制, ...
- 9-java学习-多态、抽象类、接口-案例代码
9-java学习-多态.抽象类.接口-案例代码 一.多态 1.多态:一种事物,在不同时刻所表现出的不同状态. 多态的前提要有继承.没有继承,那么动态就无从谈起 多态要有方法重写,如果没有方法重 ...
- 最简单 VB6.易语言选股接口案例
VB6 调用选股案例 Private Declare Function Get_Stock Lib "XuanGu.dll" (ByVal Key As String, ByVa ...
- 案例:文件下载需求:1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载||中文文件问题
文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 * 分析: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示 ...
最新文章
- 一个html的文件当中读取另一个html文件
- 医学科研中的作用_医学论文中参考文献的作用及常见类型
- memcached 相关
- VirtualBox下安装Ubuntu Server 16.04
- 常用算法一(分治算法)
- 实现Singleton模式
- Android webView嵌套h5页面 软键盘遮盖页面问题 解决方案 java kotlin
- Java入门——(5)Java API
- 解决 psftp local: unable to open 的问题
- 基于内容的图像检索系统 【多媒体系统导论大作业】
- 每周大数据论文(一)Data-intensive applications, challenges, techniques and technologies: A survey on Big Data
- Dilworth 定理
- 大数据正当时,理解这几个术语很重要
- 百度竞价推广需要注意什么?
- php lottery,PHP+Ajax+lottery.js抽奖整个流程
- 2022 虎符 pwn mva
- 触宝输入法 v6.9.8.7
- 傻-amp;gt;天使
- 12月28日 OpenCV 实战基础学习笔记——疲劳检测
- 使用向量叉乘判断点是否在三角形内
热门文章
- AE安装部署以及监测ArcEngine runtime 9.3是否安装
- Weighted Slope One 算法
- 精通Android自定义View(九)绘制篇Canvas分析之绘制图片
- Codewars--8kyu解题集
- sublime text3常用的一些快捷键
- hbuilder的aptana php插件无法提示命名空间之外函数和对象的解决办法
- [LeetCode] 143. Reorder List_Middle tag: Linked List
- 【[USACO09DEC]牛收费路径Cow Toll Paths】
- java ssm框架 mapper文件里的#符号和$符号的区别
- 在CentOS7上安装配置Corosync高可用集群过程全记录