总结了一下,各浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的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编码的中文输出

对应的Java代码如下:

折叠 展开 复制代码

  1. new_filename = URLEncoder.encode(filename, "UTF8");
  2. // 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的
  3. rtn = "filename=/"" + new_filename + "/"";
  4. if (userAgent != null)
  5. {
  6. userAgent = userAgent.toLowerCase();
  7. // IE浏览器,只能采用URLEncoder编码
  8. if (userAgent.indexOf("msie") != -1)
  9. {
  10. rtn = "filename=/"" + new_filename + "/"";
  11. }
  12. // Opera浏览器只能采用filename*
  13. else if (userAgent.indexOf("opera") != -1)
  14. {
  15. rtn = "filename*=UTF-8''" + new_filename;
  16. }
  17. // Safari浏览器,只能采用ISO编码的中文输出
  18. else if (userAgent.indexOf("safari") != -1 )
  19. {
  20. rtn = "filename=/"" + new String(filename.getBytes("UTF-8"),"ISO8859-1") + "/"";
  21. }
  22. // Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出
  23. else if (userAgent.indexOf("applewebkit") != -1 )
  24. {
  25. new_filename = MimeUtility.encodeText(filename, "UTF8", "B");
  26. rtn = "filename=/"" + new_filename + "/"";
  27. }
  28. // FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出
  29. else if (userAgent.indexOf("mozilla") != -1)
  30. {
  31. rtn = "filename*=UTF-8''" + new_filename;
  32. }
  33. }

目前,我测试的情况,在几个浏览器上都能正常输入中文文件名

但,也许浏览器不同版本,可能还会有乱码的情况.....