文件下载需求:
    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. 完成图片文件下载||中文文件问题相关推荐

  1. 前端<a>标签超链接,触发点击事件后弹出about:blank#blocked页

    一.问题描述 今天碰到一个特别奇怪的问题,我在点击一个超链接按钮后,会弹出一个about:blank#blocked页,原页面后续逻辑也会继续走下去,难受的点就是为什么会弹出这么一个页面. 二.问题分 ...

  2. C#中在鼠标经过Button控件时显示提示信息(弹出气泡提示框)

    C#有个ToolTip的控件是弹出气泡提示框的,在界面上放一个ToolTip1控件,可以在所有需要弹出气泡的控件的属性中的"toolTip1的ToolTip"填写需要提示的信息就行 ...

  3. 异步任务下载apk文件并弹出对话框提示当前进度,文件下载结束后弹出安装界面

    主要任务 1.下载apk保存到sd卡指定目录 2.下载时显示下载的进度 3.下载完成后弹出对话框提示安装 分析过程: 联网操作不能在UI线程(主线程)进行 需要开启线程下载,为了效率我们这里采用异步线 ...

  4. Java 技术篇-利用exe4j工具生成exe文件实例演示,IntelliJ IDEA将项目转化为jar包方法,运行生成后的程序弹出exe4j提示处理,生成的程序显示控制台设置方法

    Java 项目转化为 exe 可执行文件 第一章:IntelliJ IDEA 将项目转化为 jar 包 ① 设置 Artifacts ② 设置是否集成外部 jar 包 ③ 将 java 项目转化为 j ...

  5. Android --- 进入页面时,不弹出软键盘。当 EditText 被点击时不弹出软键盘,而是调用其他选择器,比如时间选择器等

    功能需求: 1.进入页面时,不弹出软键盘 2.当 EditText 被点击时不弹出软键盘,而是调用其他选择器,比如时间选择器等 搜索百度测试: 1.百度上说用 editText.setInputTyp ...

  6. plsql登录进去的时候,有个弹窗,但是我勾选了,下次不再显示,但是我又想让他弹出了,怎么恢复?

    plsql登录进去的时候,有个弹窗,但是我勾选了,下次不再显示,但是我又想让他弹出了,怎么恢复? PLSQL Developer中,关闭confirm提示窗口,如何恢复?

  7. 360安全浏览器右击不显示审查元素 或按F12不弹出开发人员工具的原因和解决方法:设为极速模式

    360安全浏览器右击不显示审查元素 或按F12不弹出开发人员工具的原因和解决方法:设为极速模式 参考文章: (1)360安全浏览器右击不显示审查元素 或按F12不弹出开发人员工具的原因和解决方法:设为 ...

  8. H5页面 ios 键盘收起后弹出层焦点错位

    请注明出处:https://blog.csdn.net/qq_23179075/article/details/86497498 解决H5页面 ios键盘收起后弹出层焦点错位问题 用 H5 写app页 ...

  9. 计算机输入法如何显示在桌面,Windows10系统启用输入法语言栏桌面提示框的方法...

    一位 windows10系统 用户反馈自己由于工作需求,要进行频繁的中英文转换,可是桌面并未显示输入法语言栏提示框,每次操作都很不方便.这该怎么办呢?下面,就随小编看看Windows10系统启用输入法 ...

最新文章

  1. Servlet的Cookie值保存与获取
  2. 下qemu模拟arm9_QEMU搭建树莓派环境
  3. Docker安装mysql8
  4. 计算机工程信息学院严翔,严翔校长第六次大师课
  5. 1.10.返回四舍五入后的值.round()
  6. Red Hat 6.5 Samba服务器的搭建(匿名访问,免登录)
  7. hadoop -- mapreduce执行过程
  8. 批量梯度下降(BGD)、小批量梯度下降(mini-BGD)、随机梯度下降(SGD)优缺点比较
  9. 对抗神经网络学习和实现(GAN)
  10. C语言中 pow函数的使用
  11. 眼镜寿命不仅跟镜架材质有关,还跟习惯有关系!
  12. JavaScript调用C#办法-转帖
  13. div+css静态网页设计——男女装商城-功能齐全(40页) HTML+CSS+JavaScript 大学生网店作品 商城网页设计作业模板 学生网页制作源代码下载
  14. HOJ 12814 SIRO Challenge (状态压缩DP)
  15. Fresco使用详情
  16. 掌握销售谈判三大策略,开单成功率提升60%!
  17. 深圳中学高考2021成绩查询,2020深圳高中高考数据对比,明年考多少分能上好高中?...
  18. DWI_preprocessing DTI_reduce commands
  19. 精通CSS与HTML设计模式 第一章(轻松搞定CSS)
  20. wps 2019个人版 创建布尔运算

热门文章

  1. 网络基础之 Nping 命令
  2. windows server 2008 如何查看异常重启日志
  3. Access中出现改变字段“自己主动编号”类型,不能再改回来!(已解决)
  4. .DLL文件是什么?
  5. Android.mk解析
  6. NKStartup的参数KData
  7. vba代码编程800例_一组实用的VBA常用编程代码语句分享
  8. Java 9 CompletableFuture 进化小脚步
  9. Win32_16来看看标准菜单和右键菜单的玩法
  10. 数据挖掘实战(一):Kaggle竞赛经典案例剖析