[转]⽂件下载中⽂显⽰content-disposition正确设置----http:
hi。。。
【转】⽂件下载中⽂显⽰ content-disposition 正确设置
补充: 在IE下,filename 必须保留扩展名部分(xxx.doc), ⽂件名中的中⽂才能正确解码, 否则可能不识别%20(空格), 甚⾄在ie6下全部都是未解码的格式(%xx).
另外原始的空格使⽤urlEncode 编码后转换为+号(基于历史原因), ⽽ie解析时会直接作为+号处理, 因此需要⼿⼯替换⼀下这个特殊字符.
safari相对⽐较变态, filename部分只能使⽤utf-8的原始字节,⽽http header 必须使⽤单字节编码的字符串, 因此需要将原始内容重新构造为iso-8859-1单字节编码的字符串,即:new Bytes("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-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 = de(filename, "UTF8");
// 如果没有UA,则默认使⽤IE的⽅式进⾏编码,因为毕竟IE还是占多数的
rtn = "filename=\"" + new_filename + "\"";
if (userAgent != null)
{
userAgent = LowerCase();
// 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 Bytes("UTF-8"),"ISO8859-1") + "\"";        }
// Chrome浏览器,只能采⽤MimeUtility编码或ISO编码的中⽂输出
else if (userAgent.indexOf("applewebkit") != -1 )
{
new_filename = deText(filename, "UTF8", "B");
rtn = "filename=\"" + new_filename + "\"";
}
// FireFox浏览器,可以使⽤MimeUtility或filename*或ISO编码的中⽂输出
chrome直接下载else if (userAgent.indexOf("mozilla") != -1)
{
rtn = "filename*=UTF-8''" + new_filename;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。