资讯专栏INFORMATION COLUMN

各浏览器下载文件名不乱码的解决办法

VishKozus / 1194人阅读

摘要:在项目中发现,使用下载中文名文件的时候,下载的文件名是乱码的问题。但是这个问题在,,中是没有的。原先以为是的,但是细细研究之下你会发现这个简单的文件下载问题在协议里经历了多少波折。

在项目中发现,使用Safari下载中文名文件的时候,下载的文件名是乱码的问题。但是这个问题在IE,Firefox,Chrome中是没有的。原先以为是Safari的bug,但是细细研究之下你会发现这个简单的文件下载问题在HTTP协议里经历了多少波折。

研究的结果也不是我自己写的,具体可以看这两篇文章

Serving file downloads with non-ascii

正确处理下载文件时HTTP头的编码问题(Content-Disposition)

这里直接贴出java代码

/**
* 
* 浏览器下载文件时需要在服务端给出下载的文件名,当文件名是ASCII字符时没有问题
* 当文件名有非ASCII字符时就有可能出现乱码
*
* 这里的实现方式参考这篇文章
* http://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/
*
* 最终设置的response header是这样:
*
* Content-Disposition: attachment;
*                      filename="encoded_text";
*                      filename*=utf-8""encoded_text
*
* 其中encoded_text是经过RFC 3986的“百分号URL编码”规则处理过的文件名
* 
* @param response * @param filename * @return */ public static void setFileDownloadHeader(HttpServletResponse response, String filename) { String headerValue = "attachment;"; headerValue += " filename="" + encodeURIComponent(filename) +"";"; headerValue += " filename*=utf-8""" + encodeURIComponent(filename); response.setHeader("Content-Disposition", headerValue); } /** *
* 符合 RFC 3986 标准的“百分号URL编码”
* 在这个方法里,空格会被编码成%20,而不是+
* 和浏览器的encodeURIComponent行为一致
* 
* @param value * @return */ public static String encodeURIComponent(String value) { try { return URLEncoder.encode(value, "UTF-8").replaceAll("+", "%20"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66214.html

相关文章

  • java实现览器下载文件,并解决兼容览器文件下载中文乱码

    摘要:浏览器下载代码如下通过循环将读入的文件的内容输出到浏览器中如果文件名为中文,上面的代码下载的文件名会乱码。解决中文乱码方法拿到浏览器请求的判断是否包含,是则直接讲文件名转换为,否则使用转换。 场景描述: 由于项目需求,需要支持浏览器下载文件,比如招聘网站的在线简历下载。 浏览器下载代码如下: public static void downloadFile(File file,...

    tunny 评论0 收藏0
  • Servlet第三篇【request和response简介、response常见应用】

    摘要:什么是对象响应由状态行实体内容消息头一个空行组成。为什么使用方法能够正常向浏览器输出中文呢你好呀我是中国这句代码在转成数组的时候默认查的是编码,而你好呀我是中国支持编码,所以可以正常显示出来。 response、request对象 Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的response对象 既然request对象...

    Youngs 评论0 收藏0
  • 那些年我们踩过乱码

    摘要:因此导致乱码的真正原因就是各平台间对标准实现不一致包括实现的时间先后不同,以及所代表含义不同。日本几家公司各自定义了一套标准,用两个字节表示符号,日本电脑系统的一种编码编码是从到。在上找到了与标准的对应关系。 欢迎关注个人网站:http://www.iamaddy.net/2016/07/emoji-unicode-parser/ 前言 这是一个由乱码引发的故事。抱歉我暂时找不到更加惨...

    jhhfft 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<