【转】文件下载中文显示 content-disposition 正确设置
2015-03-01 15:04
337 查看
另外原始的空格使用urlEncode 编码后转换为+号(基于历史原因), 而ie解析时会直接作为+号处理, 因此需要手工替换一下这个特殊字符.
URLEncoder.encode("中文+ en", "UTF-8").replaceAll("\\+", "%20");
safari相对比较变态, filename部分只能使用utf-8的原始字节,而http header 必须使用单字节编码的字符串, 因此需要将原始内容重新构造为iso-8859-1单字节编码的字符串,即:new String(filename.getBytes("UTF-8"),"ISO8859-1")
另外我用了几个新的浏览器做了几个对比测试
编码方式 | 测试通过的浏览器
RFC2231 filename* | ie9 ,chrome17 , opera11,firefox11
iso-8859-1 (utf-8): | chrome,opera,firefox,safari
url-encode(utf-8) | ie6+ (文件名必须带扩展名), chrome\opera(%2B 加号不识别)
因此兼容规则设置为 ie: urlEncode , opera\firefox : filename*, safari\chrome: iso-8859-1 比较合适
-------------- 割~~~ ------------------
下面是网上找的关于content-dispositoin显示中文问题的唯一正确的总结... 转载自: /article/4151531.html
浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的Content-Disposition,那么应该就不会出现中文文件名的乱码问题了。
首先,Content-Disposition值可以有以下几种编码格式
1. 直接urlencode:
Content-Disposition: attachment; filename="struts2.0%E4%B8%AD%E6%96%87%E6%95%99%E7%A8%8B.chm"
2. Base64编码:
Content-Disposition: attachment; filename="=?UTF8?B?c3RydXRzMi4w5Lit5paH5pWZ56iLLmNobQ==?="
3. RFC2231规定的标准:
Content-Disposition: attachment; filename*=UTF-8''%E5%9B%9E%E6%89%A7.msg
4. 直接ISO编码的文件名:
Content-Disposition: attachment;filename="测试.txt"
然后,各浏览器支持的对应编码格式为:
1. IE浏览器,采用URLEncoder编码
2. Opera浏览器,采用filename*方式
3. Safari浏览器,采用ISO编码的中文输出
4. Chrome浏览器,采用Base64编码或ISO编码的中文输出
5. FireFox浏览器,采用Base64或filename*或ISO编码的中文输出
new_filename = URLEncoder.encode(filename, "UTF8");
// 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的
rtn = "filename=\"" + new_filename + "\"";
if (userAgent != null)
{
userAgent = userAgent.toLowerCase();
// IE浏览器,只能采用URLEncoder编码
if (userAgent.indexOf("msie") != -1)
{
rtn = "filename=\"" + new_filename + "\"";
}
// Opera浏览器只能采用filename*
else if (userAgent.indexOf("opera") != -1)
{
rtn = "filename*=UTF-8''" + new_filename;
}
// Safari浏览器,只能采用ISO编码的中文输出
else if (userAgent.indexOf("safari") != -1 )
{
rtn = "filename=\"" + new String(filename.getBytes("UTF-8"),"ISO8859-1") + "\"";
}
// Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出
else if (userAgent.indexOf("applewebkit") != -1 )
{
new_filename = MimeUtility.encodeText(filename, "UTF8", "B");
rtn = "filename=\"" + new_filename + "\"";
}
// FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出
else if (userAgent.indexOf("mozilla") != -1)
{
rtn = "filename*=UTF-8''" + new_filename;
}
}
相关文章推荐
- JSP文件下载中文和空格显示Content-Disposition设置
- 正确处理下载文件时中文文件名乱码的问题(Content-Disposition)
- 使用response.setHeader("Content-Disposition","attachment;filename="+fName)下载文件,中文文件名无法显示的问题
- JavaWeb---设置content-disposition响应头,让浏览器下载文件
- 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)
- 转:正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)
- Content-Disposition 文件上传、下载 中文乱码 HTTP头 解决办法 Java Jersey
- 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)
- 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)
- 文件下载_中文乱码:"Content-disposition","attachment; filename=中文名
- 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)
- Content-Disposition 响应头,设置文件在浏览器打开还是下载
- 文件下载_中文乱码:"Content-disposition","attachment; filename=中文名
- 使用Content-Disposition: attachment; filename=FILENAME,在Firefox浏览器中下载文件,文件名中文乱码问题解决。
- 设置响应头的Content-Disposition属性,实现文件下载示例
- 正确处理下载文件时HTTP头的编码问题(Content-Disposition)
- 正确处理下载文件时HTTP头的编码问题(Content-Disposition
- <转载>正确处理下载文件时HTTP头的编码问题(Content-Disposition)
- Content-Disposition 指定该被下载时的名称:attachment和inline的区别,使用a标签下载时,文件的ContentDisposition属性设置
- 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)