博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于浏览器下载文件名乱码问题
阅读量:3959 次
发布时间:2019-05-24

本文共 1590 字,大约阅读时间需要 5 分钟。

关于浏览器下载文件名乱码问题

在Web开发中,我们会写下面的(本文我以Chrome浏览器讲解,旨在讲解一些底层原理,为什么乱码,由于不同浏览器解码不同,所以我选择了Chrome为基础讲解)

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// req.setCharacterEncoding("utf-8");//设置获取参数的格式,但如果是Get方式不写特不会乱码,本次测试我没写 String filename = req.getParameter("filename");//获取参数filename ServletContext servletContext = this.getServletContext();//获取域对象 String mimeType = servletContext.getMimeType(filename);//获取Mime数据格式 resp.setContentType(mimeType);//设置响应头 resp.setHeader("content-disposition","attachment;filename="+filename);//这一步我标号为① String path = servletContext.getRealPath("image/"+filename); System.out.println(path); ServletOutputStream outputStream = resp.getOutputStream(); System.out.println("图片"); FileInputStream fileInputStream = null; try {
fileInputStream = new FileInputStream(path); } catch (FileNotFoundException e) {
e.printStackTrace(); return; } byte[] bt = new byte[1024 * 1024]; fileInputStream.read(bt, 0, bt.length); fileInputStream.close(); outputStream.write(bt, 0, bt.length); outputStream.close(); }

在①这一步会发生这样的事情,Tomcat会默认的把(注意这里的编码格式不是content-type里设置来确定的)filename以ISO-8859-1转化为二进制流数据保存在响应头content-dispositin中然后给Chrome,Chrome会以UTF-8解码然后放在响应头中,之后在从刚刚放的响应头中再解码一次才是最终的文件名。过程如下图解如下:

代码模拟这一过程:
在这里插入图片描述在这里插入图片描述
在浏览器中:
在这里插入图片描述
解决办法:在①前加上:

filename = URLEncoder.encode(filename, "utf-8");

代码模拟这一过程:

在这里插入图片描述
在这里插入图片描述
浏览器结果:在这里插入图片描述
不同浏览器解码方式不同,但原理一样。

转载地址:http://qilzi.baihongyu.com/

你可能感兴趣的文章
[教程] Android PHP 最佳实践视频教程
查看>>
[无线] AndroidManifest.xml配置文件详解
查看>>
[无线] 2012 智能手机市场分析
查看>>
[移动] Android推送方案分析(MQTT/XMPP/GCM)
查看>>
[移动] Mosquitto简要教程(安装/使用/测试)
查看>>
[HTML5] 关于HTML5(WebGL)的那点事
查看>>
自我反思
查看>>
初识网络编程
查看>>
很像动态规划的贪心
查看>>
东北赛选拔教训
查看>>
hash
查看>>
涨姿势了:求两个分子的最大公倍数
查看>>
快速幂
查看>>
vector.reserve and resize &&vector与map结合
查看>>
最短路
查看>>
最长公共子序列
查看>>
计算几何
查看>>
求解方程
查看>>
太弱了。。水题
查看>>
位运算(含应用)
查看>>