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

servlet:downLoadServlet

package cn.itcast.download;import cn.itcast.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 = request.getServletContext();String realPath = servletContext.getRealPath("/img/" + filename);//2.2用字节流关联FileInputStream fis = new FileInputStream(realPath);//3.设置reponse的响应头//3.1设置响应头类型:content-typeString mimeType = servletContext.getMimeType(filename);//获取文件的mimeType类型response.setHeader("content-type", mimeType);//3.2设置响应头打开方式:content-disposition   以附件形式下载response.setHeader("content-disposition", "attachment;filename=" + filename);//解决中文文件名问题//1.获取user-agent请求头String agent = request.getHeader("user-agent");//2.使用工具类方法编码文件名即可String fileName = DownLoadUtils.getFileName(agent, filename);//3.将输入流的数据写出到输出流中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);}
}

utils:DownLoadUtils工具类

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("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;}
}

前端页面:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title></head><body><a href="/day15/img/1.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>

资源文件放在web——img文件夹中

文件下载及解决中文名乱码问题相关推荐

  1. java的excel模板下载(解决中文名乱码问题)

    业务场景:  项目中发现如果供下载的模板直接放在vue前端,而用nginx转发时直接报nginx error,原因可能是无法解析中文名. 那作为后端开发,解决方法之一是直接提供接口,通过流输出模板,以 ...

  2. 关于导出文件中文名乱码问题,response.setHeader(),postman测试有误,直接用浏览器测试

    问题描述 根据项目需求,需要导出excel文件,文件名包含中文字符,使用postman测试下载,导出的文件名始终不对. 解决问题 话不多说,下面是我解决中文名乱码的设置 response.setCon ...

  3. java 下载文件的文件名乱码_JAVA 文件下载时的文件名乱码解决

    JAVA 文件下载时的文件名乱码解决 if(null != agent && -1 != agent.indexOf("MSIE")){ filename = UR ...

  4. springMVC+ajaxFileUpload中文名乱码的问题

    最近在做一个文件上传的功能,使用的是ajaxFileUpload作为前台上传功能,实际使用中发现问题有2个 1.file组件的change事件只能触发一次. 2.上传的中文名乱码 关于1:file组件 ...

  5. git status 显示中文和解决中文乱码

    git status 显示中文和解决中文乱码 文章目录 git status 显示中文和解决中文乱码 解决git status不能显示中文 解决git bash 终端显示中文乱码 通过修改配置文件来解 ...

  6. csv导出文件解决中文乱码和文件名空格问题

    csv导出文件解决中文乱码和文件名空格问题 开发环境 前端:Vue 后端:Java 问题的出现: 1.csv的文件中文内容 excel打开是乱码,wps没问题(wps会进行不同的编码转换,excel不 ...

  7. sqlserver mysql 乱码_SQLServer数据库如何解决中文乱码问题?方法有哪些?

    很多使用数据库的人都知道,在安装SQLServer数据库是,如果设置不当就会出现一些中文乱码.主要原因是,很多人在使用默认安装系统时,一般不会考虑到默认排序的规则是拉丁文的排序规则,只是点击下一步,在 ...

  8. php utf-8读取,PHP读取文件,解决中文乱码UTF-8的方法分析

    PHP读取文件,解决中文乱码UTF-8的方法分析,方法,中文,操作技巧,文本,本文 PHP读取文件,解决中文乱码UTF-8的方法分析 易采站长站,站长之家为您整理了PHP读取文件,解决中文乱码UTF- ...

  9. java txt中文乱码,JAVA读取TXT文件 可解决中文乱码问题

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...

最新文章

  1. Sqoop_ 简单介绍
  2. 东南亚跨境电商蓬勃发展,马来西亚市场分析及选品
  3. vectorvn1610报价_【8.5873.5444.G323】价格_厂家 - 中国供应商
  4. Linux_CentOS-服务器搭建 六
  5. 【Flink】Flink 基于事件序列最大值 AssignerWithPeriodicWatermarks
  6. AI 算法在 FPGA 芯片上还有这种操作?
  7. 什么是BI(Business Intelligence
  8. 设计模式(Design Patterns)总结归纳
  9. signature=9293cc4bd6f47e4f2a5f299011c6e89e,02-本地证书配置指导
  10. cad插入块_如何实现CAD图纸块的插入及合并操作
  11. 微信永久封禁:从入门到精通
  12. 基于Vue的俄罗斯方块游戏设计与实现
  13. 基于docker实现人人影视CVNT虚拟化多开,基于selinum实现自动化点击程序
  14. 吕旭军:如何打造区块链数字资产交易?
  15. steam饥荒存档备份_如何查找和备份您的Steam屏幕截图
  16. 新点软件怎么导入清单_表格软件excel怎样导入数据 | 新点软件怎么导入excel清单表格 表格有什么要求???...
  17. 大数据的5大关键技术点
  18. Glide系列(四) — Glide缓存流程分析
  19. HDU4745 Two Rabbits(区间dp)
  20. Win32汇编(SMU—递归子程序)

热门文章

  1. 认识jQuery的Promise
  2. python工程师必备工具
  3. IT痴汉的工作现状14-段子
  4. 【024】Vue+Springboot+mysql员工考勤管理系统(多角色登录、请假、打卡)(含源码、数据库、运行教程、实验报告)
  5. 教你如何理解贝叶斯公式
  6. 第5 部分 EIGRP
  7. PMP快速通过经验分享
  8. 前端涨薪必读,node.js入门保姆级教程
  9. 如何停止定时任务@Scheduled
  10. SQL dialect is not configured.