关于中文文件下载的问题,网上的咨询和答疑已经很多,我原来处理下载的代码如下:
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
下载的程序里有了这句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。不过当时确实没有仔细测试文件名很长的中文文件名。先如今经过仔细测试,发现文字只要超过17个字,就不能下载了。经过好一番google和反复测试,总算对这个问题有了系统的认识,分列如下:
一. 通过我原来的方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。这是IE的bug,参见微软的知识库文章
KB816868 。原因可能是因为ie在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以便会报错。微软提供了一个补丁,可以从
这里下载。这个补丁需要先安装ie6 sp1。因为我平时勤打补丁,我的IE6版本号是 6.0.2800.1106.xpsp2_xxxxx。所以我可能已经安装过了补丁,从而可以下载,但仍然出现文件名被截断的现象。微软让我们等待IE下一个service pack的发布。我今天也上网看到了好消息,迫于firefox的压力,IE7可能在年中发布。另外,Firefox 不支持这样的方式,将把编码后的%xx%xx直接作为文件名显示。
二. 我尝试使用 javamail 的MimeUtility.encode()方法来编码文件名,也就是编码成 =?gb2312?B?xxxxxxxx?= 这样的形式,并从
RFC1522中找到对应的标准支持。不过很遗憾,IE6并不支持这一个标准。我试了一下,Firefox是支持的。
三. 按网上很多人提供的解决方案:将文件名编码成ISO8859-1似乎是有效的解决方案,代码如下:
response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );
在确保附件文件名都是简体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。如果台湾同胞用,把gb2312改成big5就行。但现在的系统通常都加入了国际化的支持,普遍使用UTF-8。如果文件名中又有简体中文字,又有繁体中文,还有日文。那么乱码便产生了。另外,在我的电脑上Firefox(v1.0-en)下载也是乱码。
折中考虑,我结合了一、三的方式,代码片断如下:
String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");
/*
* see
http://support.microsoft.com/default.aspx?kbid=816868 */
if (fileName.length() > 150) {
String guessCharset = xxxx /*根据request的locale 得出可能的编码,中文操作系统通常是gb2312*/
fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1");
}
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
暂且不考虑 Firefox 是因为它目前似乎还没有有力侵食到IE的企业用户市场。影响客户买单的常常是进度,而不是兼容度。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/37861/showart_412653.html
分享到:
相关推荐
在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...
本文将深入探讨Java文件下载的实现方式以及如何解决中文乱码问题。 首先,我们需要理解HTTP协议中的Content-Disposition头的作用,它用于告知浏览器如何处理响应体的内容,比如作为附件下载。在Java中,我们通常...
总的来说,处理Java中CSV文件的中文乱码问题主要涉及正确设置字符编码,而给定的.NET DLL文件与此问题的解决没有直接关联。如果你在.NET环境中遇到类似问题,可以参考.NET的编码处理方式,或者寻找适合的.NET库来...
java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt...
Java文件下载文件名乱码问题解决方案 Java 文件下载文件名乱码问题是指在下载 Java 文件时,文件名出现乱码现象,影响下载文件的正确性。这种问题通常有两种情况:一是下载时中文文件名乱码,二是下载时因为路径中...
### Java实现文件下载并解决中文文件名乱码 在日常的Web开发中,经常会遇到需要让用户下载文件的需求,尤其是在企业级应用中。然而,在实际操作过程中可能会遇到一个常见问题:当文件名包含中文字符时,下载后的...
Java 生成 PDF 文件,解决中文乱码问题 Java 生成 PDF 文件,解决中文乱码问题是 Java 编程中常见的问题。解决这个问题的关键是正确地设置中文字体,以避免乱码问题。本文将通过一个完整的示例代码,详细讲解如何...
往往开发环境和生产环境在环境部署时会遇到很多奇怪的问题,此次word文档下载就被卡住了,通过一番努力终于找到了原因,分享给大家。上传文件txt格式,内有方法详细的代码注释及原因说明,jar包比较常见,大家自行...
解决Java文件乱码问题,主要有以下几个步骤: 1. **指定编码**:在使用`BufferedReader`、`FileReader`或其他I/O类读取文件时,可以使用`InputStreamReader`来指定编码。例如: ```java BufferedReader reader = ...
在Linux环境下,使用Java生成包含中文的图片时,经常遇到一个常见的问题——中文字符显示为乱码。这个问题的根源在于Linux系统默认的字体库中可能缺少支持中文的字体,因此在渲染中文字符时无法正确显示。针对这个...
在Java编程中,遇到“java下载时文件名乱码”的问题通常是由于编码不一致或处理不当造成的。在处理文件下载时,尤其是从Web服务器下载带有非ASCII字符的文件名时,这种问题尤为常见。让我们深入探讨这个问题,并提供...
在Java中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...
在Java开发中,遇到中文乱码问题是一种常见的挑战,特别是在处理URL时。URL中文乱码问题主要是由于URL编码和解码过程中的不一致导致的。下面将详细介绍如何解决这个问题,并探讨几种常用的方法。 首先,我们需要...
"Java读取TXT文本文件乱码解决方案" Java 读取 TXT 文本文件乱码解决方案中,主要讨论的是在 Java 中读取 TXT 文本文件时出现乱码的问题,并提供了解决方案。 首先,文章中提供了一个简单的读取 TXT 文件的代码,...
当用户需要获取服务器上的资源,如文档、图片或者视频等,通常会通过点击下载链接触发服务器进行文件传输。本项目针对的一个重要问题就是如何在使用IE11浏览器时避免出现文件名乱码的情况。 首先,我们要理解这个...
本文将深入探讨如何在Java中解决Properties文件保存和读取中文乱码的挑战。 首先,我们需要理解Java默认使用ISO-8859-1编码来处理Properties文件。由于此编码不支持大部分中文字符,因此在保存或加载包含中文的...
本文将详细介绍如何解决JAVA反编译文件时的中文乱码问题。 首先,理解问题的根源:Java源代码默认采用UTF-8编码,但某些情况下,源代码可能使用了其他编码方式,如GBK。当这些源代码被编译成字节码后,再用不支持...
### Java导出Excel文件并下载到客户端(含解决中文乱码问题) 在现代的企业级应用开发中,数据导出功能是非常常见的一种需求。特别是在B/S架构的应用中,用户经常需要将查询结果导出为Excel文件以便进行后续的数据...