下载文件时,文件名乱码。
Unicode网页中上传下载文件时发生文件名乱码的问题
最 近有一个需要支持unicode的项目在上传和下载文件时遇到文件名乱码问题. 项目背景, 这个项目关键之处在于需要支持unicode以及支持Micorosoft Internet Explorer和Netscape Navigator两种浏览器. 为了解决这个问题, 我使用以下环境进行了尝试.
J2SE : 1.5.0_04
Tomcat : 5.5.17
Microsoft Internet Explorer 6.0 with SP2
Netscape Navigator 7.1
Firefox 1.5
以及Struts 1.1 (这个基本上对此次测试不是非常重要)
上传文件
对于unicode的页面进行上传文件的时候, 我使用一个text box和一个file upload box来进行比较. 页面如下.
通过此页面进行文件上传后, IE, NC以及FF所传输的数据均相同. 如下
Content-Length: 27980
-----------------------------282302224217945
Content-Disposition: form-data; name="theText"
C:/縺ゅ≠縺ゅ≠.xls
-----------------------------282302224217945
Content-Disposition: form-data; name="theFile"; filename="縺ゅ≠縺ゅ≠.xls"
Content-Type: application/vnd.ms-excel
可以看出, 对text box和file upload box中的文件名所有浏览器均采取了相同的编码. 经证实, 是上传页面的编码方式——所有浏览器均对unicode数据(utf-8)采取了本地的编码方式(这里是ms932).
在服务器端对上传的数据进行解码.
解码的方式有很多, 这里我使用最普遍以及正规的request.setCharacterEncoding的方法. 发现form表单中的text box可以被正常解码, 但是file upload box中的文件名无法 通过这种方式解码. 所以只能使用手工解码.
其中SJIS是客户端系统的编码, UTF-8是客户端页面的编码.
上传文件测试中, 所有浏览器表现一致, 需要注意的是文件名和表单数据的不同处理方式.
下载文件
使用一个unicode的JSP页面, 在页面上有一个固定的超链接, 传递给服务器一个文件名. 服务器依照这个文件名把服务器端的文件传递给客户端.
下载页面
< meta http-equiv ="content-type" content ="text/html; charset=utf-8" >
< a href ="download.do?name=ああああ.xls" > ダウンロード </ a >
对于这样一个页面, 当点击超链接后, 各浏览器处理方式不同
IE会把超链接依照页面当前编码方式编码(这里是utf-8)后, 发送给服务器端
NC和FF会把超链接依照页面编码方式编码(这里是utf-8)后, 再通过url encoding后, 发送给服务器端
(经证实, E38182是「あ」的unicode代码)
在服务器收到提交的数据后, 需要对其进行解码. 需要注意的是这种方式下使用request.setCharacterEncoding无效 . 所以必须手工解码.
其中ISO-8859-1是Tomcat服务器的特性, Tomcat会把所有的数据先转换为ISO-8859-1的形式. UTF-8是实际的编码方式.
在得到文件名后, 就可以正确地读取文件, 然后把文件传递给客户端了. 其中, 文件名是保存在Http报头(header)的Content-Disposition中.
// 或者
response.setHeader( " Content-Disposition " , " attachment; filename= " + _filename);
经实验证明, 使用inline或者attachment对文件名的编码方式没有 影响.
另外一个需要设置的是Content-Type.
// 或者
response.setContentType( " application/vnd.ms-excel; charset=UTF-8 " );
// 或者
response.setContentType( " application/x-download; name= " + _filename );
经试验证明, 使用application/*的任何形式都对文件名的编码方式没有 影响.
第二点, 经试验证明, 这里的charset设置会被三种浏览器忽略, 所以设置与否不 影响文件名的编码方式.
第三点, 经试验证明, 这里的name设置对文件名没有 任何影响.
可能还有一个属性需要注意, 就是Content-Language. 经试验证明, Content-Language有无, 或者为何值, 对文件名没有任何影响.
那么对于non-ascii的文件名如何操作才可以保证客户端可以得到正确的显示呢?
经过调查, 有三种方法(在网上搜索后认为可能这篇文章是对于这个问题探讨最深入的文章)
第一, 使用URLEncoding方法. 即对文件名进行URLEncoding.
这种方式适用于IE, 但是不适用于NC和FF. 在这种方式下, 网络上传输的是url encoding后的ascii编码.
NC和FF不能对这样的文件名进行有效的解码.
第二, 使用字符串字符集强行转换为本地字符集方法, 这样做的原理是JVM底层全部为unicode. 所以一旦一个字符串表示了正确的字符集而被存储后, 这个字符串会被转换为任意字符集.
原理二是, IE和FF对非url encoding的non-ascii文件名采用客户端系统本地的编码方式进行转换.
需要注意的是, 这里的name原本是utf-8的.
在网络上传输的为
经过试验, IE和FF支持这种方式, NC不支持. 表现为NC无法解析文件名.
第三种, 使用Base64编码文件名. 原理是这种做法符合RFC2047 的定义.
使用到了JavaMail中的Base64编码的类MimeUtility.
在网络上传输的为经过Base64编码的ascii字符.
只有FF支持这种方式, IE表现为无法解析文件名, NC表现为忽略Base64编码.
以 上三种方法是目前来讲, 使浏览器可以正确下载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.
下载文件时,文件名乱码。相关推荐
- 火狐浏览器下载文件时文件名乱码问题的解决
火狐浏览器在微信网页版或其他网站中下载文件时,存在文件名乱码的问题,搜索了很多解决办法,写的都比较复杂,不适合我这种不懂代码的人.后来发现火狐浏览器附加组件addons上可以搜到解决此问题的组件,就是 ...
- ie浏览器打开aspx文件乱码_ie浏览器下载文件时文件名乱码
做一个文件下载功能时,用ie浏览器下载时文件名乱码,火狐和谷歌正常,修改后ie显示正常,修改方法如下: @RequestMapping(value = "fileDownload" ...
- Linux火狐浏览器下载文件时文件名乱码
火狐下载时文件名会乱码,其他浏览器如360.奇安信.扣扣都是正常的! 本文转自https://blog.csdn.net/tengqingyong/article/details/79943971?u ...
- Win10 Edge 下载文件时文件名乱码 解决方案
如果是win10家庭版要先开启组策略: 新建一个txt文件输入 @echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicin ...
- Java下载文件时文件名出现乱码(但文件内容正常)
今天写文件下载时,发现以前忽略的问题,写个小记录 我们一般使用中文操作系统,所以要求的 文件名编码最好是utf-8,国际化一点 但是,似乎实际上不是这样 1. String fileName=new ...
- java下载文件时文件名中文乱码
下载文件时中文乱码是一个很常见的问题, 这不是第一次,但我希望它是最后一次了 这是个让人很头疼的问题, 明明在后台文件名还是正常的,为什么下载后文件名就乱码了呢 为什么会乱码:因为浏览器的编码和后台传 ...
- 使用IE浏览器下载文件,文件名乱码问题
实现文件下载功能时,使用IE下载出现文件名乱码不能通过以下方式判断了 if (req.getHeader("user-agent").toLowerCase().contains( ...
- php 上传文件名乱码,php上传文件时文件名乱码怎么办
php上传文件时文件名乱码的解决方法:首先在脚本头部添加[header("Content-type: text/html; charset=utf-8");]:然后利用iconv( ...
- Firefox下载文件时中文名乱码问题
为了形象化,先看几张不同浏览器下下载文件时的效果图: 1:Firefox 36.0.1 很明显在Firefox下出现了乱码,出现乱码一般是字符集的问题,这是怎么回事呢?为什么其他的浏览器都没有问题呢? ...
- 解决各大浏览器下载文件,文件名乱码的问题
最近做项目,采用Spring MVC做控制层,下载文件的文件名总是在主流浏览器上显示乱码,Firfox不是乱码了,IE下又成了乱码.也是烦,IE总是独树一帜,没办法,只能让程序去适应,在网上也搜索了很 ...
最新文章
- 两条线段相切弧_两条直线间的圆弧连接
- php处理微信返回xml数据,php将微信返回的xml格式转换成数组
- 【转】Oozie4.2.0配置安装实战
- a标签 vue 动态点击_vue实现a标签点击高亮方法
- mac osx 上Eclipse/CDT问题及解决方案
- 明显调用的表达式前的括号必须具有指针函数类型_每天三分钟带你搞懂C++基础Day5 处理类型 typedef、auto、decltype...
- vue如何强行停止ajax请求,VueJs和VueResource,从Ajax请求中删除头字段
- 封年大促|年货节优秀PSD分层模板
- Parasoft软件测试实践:什么是左移测试?
- win10安装pycocotools遇到的问题
- python下载-Python下载和安装图文教程[超详细]
- OSChina 周日乱弹 —— 普通人如何面对持刀歹徒
- 微积分 导数 微分 偏导数 方向导数 梯度 向量 雅克比矩阵 概念
- PHP存储微信昵称特殊符号过滤方法
- Python爬虫入门教程 97-100 帮粉丝写Python爬虫之【shuan色球预测前置条件】
- golang转换时间格式报missing Location in call to Date
- 【六更完结!由于字数限制开新文章继续】零基础信号与系统学习笔记:复指数信号、傅里叶级数的系数推导、三角函数正交性、离散傅里叶变换、相位补偿、z变换表、逆变换表、常见序列及其作用
- CSDN写文章——不要使用默认标题
- 【矩阵论】矩阵的相似标准型(1)
- iOS 获取所有国家名称