论坛首页 Java企业应用论坛

如何下载中文文件

浏览 21363 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-12-09  
下载中文文件乱码的问题一直困扰着我,倒不是没有办法解决这个问题,而是这些方法都不够完美,都有一些小问题。所有我说说现有的几种方法及其缺点:
1 将中文字符转化为iso-8859-1,无需编码,我看Hotmail就是这么做的。这个办法最简单,但是因为我的系统是多语言版本,很难准确地转换到iso-8859-1字符集。
2 使用URLEncoder.encode中文字符,字符集采用UTF-8。具体可以参考一篇文章《jspSmartUpload上传下载全攻略》所提出的解决方法http://tech.ccidnet.com/pub/article/c1112_a62023_p1.html。这个方法有一些小问题,一个是Mozilla不支持(这个倒是其次,不支持也罢),再一个就是中文字符如果过多(超过20个以上)IE下载会有问题。
3 使用Javamail的MimeUtility.encode方法来编码中文字符。这个方法是我最倾向使用的,毕竟是MIME标准。Mozilla是支持这个方法,但是IE又不支持(天杀的IE,连标准也不遵守)。
大家说说有没有什么好的方法可以解决下载中文文件出现的问题。
我的要求主要有两个:一个是IE运行没问题;二是必须支持Unicode(不单单是中文)。
   发表时间:2003-12-09  
没有完全看明白你说的话。
如果只做下载的话可以完全交给 Http Server(Apache、Jetty、IIS,etc.)来做。流量控制也可以通过配置 Http Server 来实现。这样与浏览器就没有任何关系了。下载的文件内容不会有任何变化,我们从来没有遇到过你说的复杂情况。
唯一一个需要注意的是中文文件名。W3C 并未规定 URL 中的字符如何编码,所以不同的浏览器实现不同。在 IE 中可以这样设置“工具->Internet选项->高级->浏览->始终以 UTF-8 发送 URL”,这样下载中文文件名的文件就不会有问题了。
0 请登录后投票
   发表时间:2003-12-10  
我的意思就是说是中文名的文件下载如何设置其HTTP头。也就是如何设置Content-Disposition的filename参数。这个文件名是动态生成的。浏览器根本不知道是什么文件名。
0 请登录后投票
   发表时间:2003-12-11  
crofton 写道
我的意思就是说是中文名的文件下载如何设置其HTTP头。也就是如何设置Content-Disposition的filename参数。这个文件名是动态生成的。浏览器根本不知道是什么文件名。

为什么一定要由 Java 程序来设置呢?交给 HTTP Server 来做不好吗?至少我们使用 IE 下载有中文文件名的文件从来没有出过问题。
是不是想得过于复杂了?呵呵。Show 一段你们的代码,我们肯定能找到答案的。
0 请登录后投票
   发表时间:2003-12-11  
请问Dlee,HTTP server怎么设置filename?
thanks
0 请登录后投票
   发表时间:2003-12-11  
jd2bs 写道
请问Dlee,HTTP server怎么设置filename?

直接放在 URL 里就可以了。
http://www.xxx.com/oa/file/10551296/63/同步记录.txt
这样做剩下的一个问题是安全性不好,如果不对 HTTP Server 设置访问某个目录下文件的权限,则任何人都可以下载该目录的文件。所以有必要使用专门的下载程序控制下载。crofton 说的就是这种情况。但是如果这种情况是一个问题,肯定早就有人解决过了。最简单的解决方法就是直接到 Google 去找答案。
我上次说错了,在 IE 中,应该把“始终以 UTF-8 发送 URL”选项去掉才能支持中文的文件名。我使用的是 IE5,可能高版本已经没有这个限制了。
0 请登录后投票
   发表时间:2003-12-11  
Google上早就搜索过了,所以才总结以上三种解决方法。但关键是这些解决方法都有一些问题。如果找不到什么比较好的方法,那暂时只好使用第二种方法。
再问一个中文文件名的问题:就是使用java.util.zip来生成一个压缩文件,如果含有中文文件名的文件,使用Winzip之类的压缩工具打开会乱码,使用jar来解压缩没这个问题。经查看源代码,发现java.util.zip总是以UTF-8来编码文件名。对于这种有什么办法可以解决么?
0 请登录后投票
   发表时间:2003-12-11  
dlee 写道
crofton 写道
我的意思就是说是中文名的文件下载如何设置其HTTP头。也就是如何设置Content-Disposition的filename参数。这个文件名是动态生成的。浏览器根本不知道是什么文件名。

为什么一定要由 Java 程序来设置呢?交给 HTTP Server 来做不好吗?至少我们使用 IE 下载有中文文件名的文件从来没有出过问题。
是不是想得过于复杂了?呵呵。Show 一段你们的代码,我们肯定能找到答案的。

其实动态生成HTTP头是很常见的,比如webmail系统中下载附件这种情况。代码也很简单(我尽量简化了):
response.setContentType("application/x-msdownload");;
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");;
OutputStream out = response.getOutputStream();;
StreamUtility.copy(in, out);;
out.close();;
in.close();;
0 请登录后投票
   发表时间:2003-12-11  
别急,你先调用:
response.setCharacterEncoding("gbk");
或者:
response.setCharacterEncoding("gb2312") ;
试一下。
0 请登录后投票
   发表时间:2003-12-11  
dlee 写道
别急,你先调用:
response.setCharacterEncoding("gbk");
或者:
response.setCharacterEncoding("gb2312") ;
试一下。

这个方法是Servlet 2.4才加上的,现在我只能Servlet 2.3,所以也就不想测试了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics