文件下载(功能实现)(详细分析)
需求:
1. 页面显示超链接
2. 点击超链接后弹出下载提示框
3. 完成图片文件下载
分析:
1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
2. 任何资源都必须弹出下载提示框
3. 使用响应头设置资源的打开方式:content-disposition:attachment;filename=xxx
步骤:
1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
2. 定义Servlet1. 获取文件名称2. 使用字节输入流加载文件进内存3. 指定response的响应头: content-disposition:attachment;filename=xxx4. 将数据写出到response输出流
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><a href="/day15/img/1.jpg">图片</a><hr><a href="/day15/downLoadServlet?filename=1.jpg">图片</a></body>
</html>
package cn.itcast.utils;import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class DownLoadUtils {public static String getFilename(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("MISE")) {//IE浏览器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {//火狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {//其他浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}
}
package cn.itcast.web.download;
import cn.itcast.web.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;@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1.获取请求参数,文件名称String filename = request.getParameter("filename");//2.使用字节输入流加载文件进内存//2.1找到文件服务器路径ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/img/" + filename);//2.2用字节流关联FileInputStream fis = new FileInputStream(realPath);//3.设置response的响应头//3.1设置响应头类型:content-typeString mimeType = servletContext.getMimeType(filename);//获取文件的mime类型response.setHeader("content-type",mimeType);//3.2设置响应头打开方式:content-disposition//解决中文文件名问题//1.获取user-agent请求头、String agent = request.getHeader("user-agent");//2.使用工具类方法编码文件名即可filename = DownLoadUtils.getFileName(agent, filename);response.setHeader("content-disposition","attachment;filename="+filename);//4.将输入流的数据写出到输出流中ServletOutputStream sos = response.getOutputStream();byte[] buff = new byte[1024 * 8];int len = 0;while((len = fis.read(buff)) != -1){sos.write(buff,0,len);}fis.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}
中文文件问题
解决思路:
1. 获取客户端使用的浏览器版本信息
2. 根据不同的版本信息,设置filename的编码方式不同`
上述代码已经解决了该问题。
文件下载(功能实现)(详细分析)相关推荐
- Android 4.3 隐藏功能 App Ops 分析
原帖位置:http://blog.mssun.me/security/android-4-3-app-ops-analysis/ Android 4.3 刚刚发布,大家还在关心功能上有没有什么亮点的时 ...
- PHP使用header实现文件下载功能
这篇文章主要介绍了PHP使用header方式实现文件下载功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下 先给大家介绍下PHP header() 函数 定义和用法 header() 函数向客户端 ...
- 功能点(FP)分析详细解释
–转载 功能点(FP)分析详细解释 Allan J. Albrecht最初于1979年在IBM开发功能点分析, 后来国际功能点用户组(IFPUG)对其进行了进一步的修改. FPA用于估算软件项目, 包 ...
- Spring Boot入门(11)实现文件下载功能
在这篇博客中,我们将展示如何在Spring Boot中实现文件的下载功能. 还是遵循笔者写博客的一贯风格,简单又不失详细,实用又能让你学会. 本次建立的Spring Boot项目的主要功能 ...
- BAT实现文件下载功能
[Win]闲来无事之-记用BAT实现文件下载功能 闲来无事之--记用BAT(批处理脚本)实现文件下载功能 标题:闲来无事之--记用BAT(批处理脚本)实现文件下载功能 作者:ZV(ZVROP) 邮件: ...
- 详细分析本机号码一键登录原理
详细分析本机号码一键登录原理! 很多 APP 的目前都支持「本机号码一键登录」功能.本机号码一键登录是基于运营商独有网关认证能力推出的账号认证产品.用户只需一键授权,即可实现以本机号码注册/登录,相比 ...
- ASP.NET网页中RAR、DOC、PDF等文件下载功能实例源代码
以前做asp.net下载功能的时候都是采用: <a href="http://www.wang0214.com/wgcms">下载</a> 的方式来实现下载 ...
- android 串口开发_详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印...
01 写在前面: 上篇关于如何在内置仅1M的Esp8285做到 OTA 升级的同步到微信公众号,竟然被安信可的某些运维人员看到了,想要转载,我很欣慰,竟然自己的笔记可以被这么大型的公司员工认可! 我是 ...
- C语言中的static 详细分析
google了近三页的关于C语言中static的内容,发现可用的信息很少,要么长篇大论不知所云要么在关键之处几个字略过,对于想挖掘底层原理的初学者来说参考性不是很大.所以,我这篇博文博采众家之长,把互 ...
- 新手向:从不同的角度来详细分析Redis
最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...
最新文章
- IP 网络性能的度量标准
- Mac 下安装 Python-OpenCV Python-OpenCV 处理图像(一):基本操作
- 固态硬盘可靠性_您可以通过使用较少的总容量来提高硬盘的可靠性吗?
- 公开课 | 知识图谱构建与应用概述
- linux的可执行文件通常放在哪个目录中?写出该目录的路径.,实验2 Linux的基本操作与 使用vi编辑器 2010 (1)...
- mysql+concat函数问题_Mysql5.7中使用group concat函数数据被截断的问题完美解决方法...
- 构造函数模式知识的扩展
- 帮助打造无障碍APP Google将自动化测试GTXiLib
- Java各层之间的关系
- Fixcel电子表格——报表模块(二)
- python __builtins__ str类 (65)
- 经典SQL语句大全(转)
- chrome devTool
- 高性能Javascript重绘和重排学习笔记
- Python3自动生成MySQL数据字典的markdown文本的实现
- 电脑应该如何升级bios版本
- 《CSS世界》--张鑫旭 : 前端样式高手进阶CSS
- JAVASE整理知识点
- mysql 校对规则_MySQL:校对规则
- 钉钉考勤与企业系统对接