案例:文件下载需求:1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载||中文文件问题
文件下载需求:
1. 页面显示超链接
2. 点击超链接后弹出下载提示框
3. 完成图片文件下载
* 分析:
1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
2. 任何资源都必须弹出下载提示框
3. 使用响应头设置资源的打开方式:
content-disposition:attachment;filename=xxx
* 步骤:
1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
2. 定义Servlet
1. 获取文件名称
2. 使用字节输入流加载文件进内存
3. 指定response的响应头: content-disposition:attachment;filename=xxx
4. 将数据写出到response输出流
* 问题:中文文件问题
解决思路:
1. 获取客户端使用的浏览器版本信息
2. 根据不同的版本信息,设置filename的编码方式不同
download.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><a href="/day15/img/2.jpg">图片1</a><a href="/day15/img/1.avi">视频</a><hr><a href="/day15/downloadServlet?filename=九尾.jpg">图片1</a><a href="/day15/downloadServlet?filename=1.avi">视频</a>
</body>
</html>
DownLoadUtils.java
package cn.itcast.web.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("MSIE")) {// 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;}
}
DownloadServlet.java
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. 点击超链接后弹出下载提示框 3. 完成图片文件下载||中文文件问题相关推荐
- 前端<a>标签超链接,触发点击事件后弹出about:blank#blocked页
一.问题描述 今天碰到一个特别奇怪的问题,我在点击一个超链接按钮后,会弹出一个about:blank#blocked页,原页面后续逻辑也会继续走下去,难受的点就是为什么会弹出这么一个页面. 二.问题分 ...
- C#中在鼠标经过Button控件时显示提示信息(弹出气泡提示框)
C#有个ToolTip的控件是弹出气泡提示框的,在界面上放一个ToolTip1控件,可以在所有需要弹出气泡的控件的属性中的"toolTip1的ToolTip"填写需要提示的信息就行 ...
- 异步任务下载apk文件并弹出对话框提示当前进度,文件下载结束后弹出安装界面
主要任务 1.下载apk保存到sd卡指定目录 2.下载时显示下载的进度 3.下载完成后弹出对话框提示安装 分析过程: 联网操作不能在UI线程(主线程)进行 需要开启线程下载,为了效率我们这里采用异步线 ...
- Java 技术篇-利用exe4j工具生成exe文件实例演示,IntelliJ IDEA将项目转化为jar包方法,运行生成后的程序弹出exe4j提示处理,生成的程序显示控制台设置方法
Java 项目转化为 exe 可执行文件 第一章:IntelliJ IDEA 将项目转化为 jar 包 ① 设置 Artifacts ② 设置是否集成外部 jar 包 ③ 将 java 项目转化为 j ...
- Android --- 进入页面时,不弹出软键盘。当 EditText 被点击时不弹出软键盘,而是调用其他选择器,比如时间选择器等
功能需求: 1.进入页面时,不弹出软键盘 2.当 EditText 被点击时不弹出软键盘,而是调用其他选择器,比如时间选择器等 搜索百度测试: 1.百度上说用 editText.setInputTyp ...
- plsql登录进去的时候,有个弹窗,但是我勾选了,下次不再显示,但是我又想让他弹出了,怎么恢复?
plsql登录进去的时候,有个弹窗,但是我勾选了,下次不再显示,但是我又想让他弹出了,怎么恢复? PLSQL Developer中,关闭confirm提示窗口,如何恢复?
- 360安全浏览器右击不显示审查元素 或按F12不弹出开发人员工具的原因和解决方法:设为极速模式
360安全浏览器右击不显示审查元素 或按F12不弹出开发人员工具的原因和解决方法:设为极速模式 参考文章: (1)360安全浏览器右击不显示审查元素 或按F12不弹出开发人员工具的原因和解决方法:设为 ...
- H5页面 ios 键盘收起后弹出层焦点错位
请注明出处:https://blog.csdn.net/qq_23179075/article/details/86497498 解决H5页面 ios键盘收起后弹出层焦点错位问题 用 H5 写app页 ...
- 计算机输入法如何显示在桌面,Windows10系统启用输入法语言栏桌面提示框的方法...
一位 windows10系统 用户反馈自己由于工作需求,要进行频繁的中英文转换,可是桌面并未显示输入法语言栏提示框,每次操作都很不方便.这该怎么办呢?下面,就随小编看看Windows10系统启用输入法 ...
最新文章
- Servlet的Cookie值保存与获取
- 下qemu模拟arm9_QEMU搭建树莓派环境
- Docker安装mysql8
- 计算机工程信息学院严翔,严翔校长第六次大师课
- 1.10.返回四舍五入后的值.round()
- Red Hat 6.5 Samba服务器的搭建(匿名访问,免登录)
- hadoop -- mapreduce执行过程
- 批量梯度下降(BGD)、小批量梯度下降(mini-BGD)、随机梯度下降(SGD)优缺点比较
- 对抗神经网络学习和实现(GAN)
- C语言中 pow函数的使用
- 眼镜寿命不仅跟镜架材质有关,还跟习惯有关系!
- JavaScript调用C#办法-转帖
- div+css静态网页设计——男女装商城-功能齐全(40页) HTML+CSS+JavaScript 大学生网店作品 商城网页设计作业模板 学生网页制作源代码下载
- HOJ 12814 SIRO Challenge (状态压缩DP)
- Fresco使用详情
- 掌握销售谈判三大策略,开单成功率提升60%!
- 深圳中学高考2021成绩查询,2020深圳高中高考数据对比,明年考多少分能上好高中?...
- DWI_preprocessing DTI_reduce commands
- 精通CSS与HTML设计模式 第一章(轻松搞定CSS)
- wps 2019个人版 创建布尔运算