Unicode网页中上传下载文件时发生文件名乱码的问题 ,转载一部分和自己的体验
我的问题主要是下载时使用name?=?new?String(name.getBytes(),?"UTF-8");
?
编码在本地好使,部署到服务器上乱码,于是改用了下面的代码:
String codedfilename = URLEncoder.encode("操作日志" + dateStrTemp + ".xls", "UTF8");
??????????????? response.setContentType("application/x-download");
??????????????? response.setHeader("Content-Disposition","attachment;filename=" + codedfilename);
?
在IE下好使,在火狐下乱码。
于是对不同浏览器采用了不同的方式进行处理
????????? String agent = request.getHeader("USER-AGENT");
??????????? String dateStrTemp = DateFormatUtils.format(System.currentTimeMillis(), "yyyyMMddHHmmss");
??????????? //如果客户端为IE浏览器,采用URLEncoder进行编码
??????????? if (null != agent && -1 != agent.indexOf("MSIE"))
??????????? {
??????????????? String codedfilename = URLEncoder.encode("操作日志" + dateStrTemp + ".xls", "UTF8");
??????????????? response.setContentType("application/x-download");
??????????????? response.setHeader("Content-Disposition","attachment;filename=" + codedfilename);
??????????? }
??????????? //如果客户端为火狐,采用MimeUtility进行编码
??????????? else if (null != agent && -1 != agent.indexOf("Mozilla"))
??????????? {???
??????????? String codedfilename = MimeUtility.encodeText("操作日志" + dateStrTemp + ".xls", "UTF8", "B");
??????????? response.setContentType("application/x-download");
??????????? response.setHeader("Content-Disposition","attachment;filename=" + codedfilename);
??????????? }
这样做之后就好用了。
?
下面是转载的别人关于文件上传下载编码的文章,感觉讲得很不错,就转过来了。
Unicode网页中上传下载文件时发生文件名乱码的问题

第二, 使用字符串字符集强行转换为本地字符集方法, 这样做的原理是JVM底层全部为unicode. 所以一旦一个字符串表示了正确的字符集而被存储后, 这个字符串会被转换为任意字符集.
原理二是, IE和FF对非url encoding的non-ascii文件名采用客户端系统本地的编码方式进行转换.
以上三种方法是目前来讲, 使浏览器可以正确下载non-ascii文件名的方法. 其中IE支持两种(url encoding和force transform), FF支持两种(force transform和base64 encoding), NC一种都不支持.
关于这次调查的结果, 对于NC多说两句, 我以为这个结果是由于NC 7.1和Tomcat 5.5不兼容造成的. Tomcat 5.5要求必须把所有报头先转变为ISO-8859-1的格式, 而NC 7.1却无法直接对ISO-8859-1进行正确的解析或者说是解析功能比较弱. 如果有时间, 我会继续验证非unicode的情况以及NC 8的情况.
---2006年9月14日21:00 补充---
在NC 8.1上进行了测试, 测试结果是NC 8.1支持方法三, 即base64 encoding.
http://www.blogjava.net/zamber/archive/2006/09/14/69752.htmlhttp://forum.java.sun.com/thread.jspa?threadID=696263