* 文件下载需求:
    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的编码方式不同

<!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>
package com.learn.web.download;import com.learn.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);}
}
package com.learn.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;}
}

案例_文件下载_代码实现相关推荐

  1. 文件下载的java代码_文件下载java代码实现

    昨天晚上写了个文件上传,今天想弄弄文件的下载.收到文件下载,我们还是先理一理思路. 文件下载其实说多了就是从服务器中(你部署的项目中)读取出资源文件,然后通过response返回给客户端.其实tomc ...

  2. java 文件下载示例_文件下载示例代码(JAVA)

    后台代码 public void exportFile() { File file = new File("模板地址"); FileInputStream fin = null; ...

  3. 文件上传_文件下载_后端获取登录用户---SpringCloud Alibaba_若依微服务框架改造---工作笔记003

    1.后台获取当前登录用户: LoginUser loginUser = tokenService.getLoginUser(); SysUser sysUser=loginUser.getSysUse ...

  4. 【笔记】Java中抽象类的概述、抽象类的特点、案例(抽象类_员工类代码实现)

    文章目录 一.抽象类的概述 二.抽象类的特点 三.案例(抽象类_员工类代码实现) 一.抽象类的概述 案例:抽象类 Test测试类部分代码 package Package1;public class T ...

  5. 复习Collection_迭代器使用细节_泛型_综合案例

    Collection_迭代器使用细节_泛型_综合案例 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collection集合 1.1 集合概述 集合:集合是java中提供的一种 ...

  6. 用python编写一个求偶数阶乘的函数_一行Python代码写阶乘函数

    原标题:一行Python代码写阶乘函数 背景 我以前用Dart写过一行的阶乘函数: fact(double n) => n < 0 ? throw ('n must be bigger t ...

  7. Day06_动态组件_插槽_自定义指令_tabbar案例

    Day06_动态组件_插槽_自定义指令_tabbar案例 文章目录 Day06_动态组件_插槽_自定义指令_tabbar案例 知识点自测 今日学习目标 1. 组件进阶 1.0 组件进阶 - 动态组件 ...

  8. 爬虫:程序_进程_线程_多线程(案例多线程下载壁纸)

    目录 前言 一.什么是程序_进程_线程? 二.实现多线程的方法 继承方式实现多线程 为什么要是用类的方式创建线程: 线程的一些常用方法: 三.多线程访问全局变量的安全性问题: 什么是线程安全: 四.解 ...

  9. textarea实现datalist效果_手把手撸代码实现Virtual Dom amp;amp; Diff

    前言 文章开篇,我们先思考一个问题,大家都说 virtual dom 这,virtual dom 那的,那么 virtual dom 到底是啥? 首先,我们得明确一点,所谓的 virtual dom, ...

最新文章

  1. Python3内置模块之Pickle和cPickle数据持久化方法小结
  2. 网络营销之微微博营销
  3. 删除sybase里面的锁_一起来学习分布式锁
  4. oracle insert 新增语句
  5. flask内置session原理
  6. wamp环境搭建到mysql就不成功_Wamp环境搭建常见错误问题解决
  7. 某中学要对学校运动会进行计算机管理,2020年新编高职入学考试适应性试卷信息技术试卷定稿名师精品资料....
  8. 14-Scala之隐式转换
  9. 洛谷P1690 贪婪的Copy 题解
  10. linux tomcat 配置数据库,tomcat把项目放在root下root.xml配置数据库
  11. 阿里架构师必学的2019最新资料!首次公布
  12. Python常用模块8-Python的email模块简介
  13. xrandr 只有一个显示屏_特斯拉Model 3显示屏拆解分析
  14. 关于Spec的一些理解
  15. 对路径“C:\inetpub\wwwroot\”的访问被拒绝
  16. 【JZOJ 4598】准备食物
  17. 加拿大约克大学计算机科学专业怎么样,加拿大约克大学优势专业有哪些?
  18. Emoji表情后台处理
  19. C语言实验06_数学
  20. A. Banana 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛

热门文章

  1. Linux networkmanager
  2. CSS3+JS切割轮播图
  3. Git常用命令备忘(一) 转载
  4. PHP高级应用视频教程大全学习
  5. Struts 体系结构与工作原理(图)
  6. JSP门户--JetSpeed
  7. 第一次作业:项目范围管理论文的提纲
  8. 移动端触摸移动小demo
  9. 汽车之家购买价格PC真正的原因阿拉丁
  10. Beaker 1.6.4 : Python Package Index