文件下载及解决中文名乱码问题
* 文件下载需求:
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文件夹中
文件下载及解决中文名乱码问题相关推荐
- java的excel模板下载(解决中文名乱码问题)
业务场景: 项目中发现如果供下载的模板直接放在vue前端,而用nginx转发时直接报nginx error,原因可能是无法解析中文名. 那作为后端开发,解决方法之一是直接提供接口,通过流输出模板,以 ...
- 关于导出文件中文名乱码问题,response.setHeader(),postman测试有误,直接用浏览器测试
问题描述 根据项目需求,需要导出excel文件,文件名包含中文字符,使用postman测试下载,导出的文件名始终不对. 解决问题 话不多说,下面是我解决中文名乱码的设置 response.setCon ...
- java 下载文件的文件名乱码_JAVA 文件下载时的文件名乱码解决
JAVA 文件下载时的文件名乱码解决 if(null != agent && -1 != agent.indexOf("MSIE")){ filename = UR ...
- springMVC+ajaxFileUpload中文名乱码的问题
最近在做一个文件上传的功能,使用的是ajaxFileUpload作为前台上传功能,实际使用中发现问题有2个 1.file组件的change事件只能触发一次. 2.上传的中文名乱码 关于1:file组件 ...
- git status 显示中文和解决中文乱码
git status 显示中文和解决中文乱码 文章目录 git status 显示中文和解决中文乱码 解决git status不能显示中文 解决git bash 终端显示中文乱码 通过修改配置文件来解 ...
- csv导出文件解决中文乱码和文件名空格问题
csv导出文件解决中文乱码和文件名空格问题 开发环境 前端:Vue 后端:Java 问题的出现: 1.csv的文件中文内容 excel打开是乱码,wps没问题(wps会进行不同的编码转换,excel不 ...
- sqlserver mysql 乱码_SQLServer数据库如何解决中文乱码问题?方法有哪些?
很多使用数据库的人都知道,在安装SQLServer数据库是,如果设置不当就会出现一些中文乱码.主要原因是,很多人在使用默认安装系统时,一般不会考虑到默认排序的规则是拉丁文的排序规则,只是点击下一步,在 ...
- php utf-8读取,PHP读取文件,解决中文乱码UTF-8的方法分析
PHP读取文件,解决中文乱码UTF-8的方法分析,方法,中文,操作技巧,文本,本文 PHP读取文件,解决中文乱码UTF-8的方法分析 易采站长站,站长之家为您整理了PHP读取文件,解决中文乱码UTF- ...
- java txt中文乱码,JAVA读取TXT文件 可解决中文乱码问题
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...
最新文章
- Sqoop_ 简单介绍
- 东南亚跨境电商蓬勃发展,马来西亚市场分析及选品
- vectorvn1610报价_【8.5873.5444.G323】价格_厂家 - 中国供应商
- Linux_CentOS-服务器搭建 六
- 【Flink】Flink 基于事件序列最大值 AssignerWithPeriodicWatermarks
- AI 算法在 FPGA 芯片上还有这种操作?
- 什么是BI(Business Intelligence
- 设计模式(Design Patterns)总结归纳
- signature=9293cc4bd6f47e4f2a5f299011c6e89e,02-本地证书配置指导
- cad插入块_如何实现CAD图纸块的插入及合并操作
- 微信永久封禁:从入门到精通
- 基于Vue的俄罗斯方块游戏设计与实现
- 基于docker实现人人影视CVNT虚拟化多开,基于selinum实现自动化点击程序
- 吕旭军:如何打造区块链数字资产交易?
- steam饥荒存档备份_如何查找和备份您的Steam屏幕截图
- 新点软件怎么导入清单_表格软件excel怎样导入数据 | 新点软件怎么导入excel清单表格 表格有什么要求???...
- 大数据的5大关键技术点
- Glide系列(四) — Glide缓存流程分析
- HDU4745 Two Rabbits(区间dp)
- Win32汇编(SMU—递归子程序)