解决各大浏览器下载文件名显示不正确的情况
来源:互联网 发布:我国经济发展数据 编辑:程序博客网 时间:2024/04/27 16:22
下载时,最关键的三步:
response.reset();//清空缓存区,防止存在某些字符使得下载的文件格式错误
response.setContentType("application/pdf;charset=UTF-8");//指定文件类型,其他类型可参见w3school的文档,也可参见下文的附录标准
response.setHeader("Content-Disposition", "attachment;filename=temp.pdf");// attachment后面一定是逗号,这个地方我就犯过错误,写成了:,结果死活不对
解决下载时,中文文件名显示不正确的方法:
理论依据:
浏览器能正确识别的编码格式,只要按照这样的编码来设置对应的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编码的中文输出
源代码:
private String getDownLoadFileName(String filename) {String new_filename = null;try {new_filename = URLEncoder.encode(filename, "UTF8");} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}HttpServletRequest request = ServletActionContext.getRequest();String userAgent = request.getHeader("User-Agent");// System.out.println(userAgent);String rtn = "filename=\"" + new_filename + "\"";// 如果没有UA,则默认使用IE的方式进行编码,因为毕竟IE还是占多数的if (userAgent != null) {userAgent = userAgent.toLowerCase();// IE浏览器,只能采用URLEncoder编码if (userAgent.indexOf("msie") != -1) {rtn = "filename=\"" + new_filename + "\"";}// Opera浏览器只能采用filename*else if (userAgent.indexOf("opera") != -1) {rtn = "filename*=UTF-8''" + new_filename;}// Safari浏览器,只能采用ISO编码的中文输出else if (userAgent.indexOf("safari") != -1) {try {rtn = "filename=\""+ new String(filename.getBytes("UTF-8"),"ISO8859-1") + "\"";} catch (UnsupportedEncodingException e) {e.printStackTrace();}}// Chrome浏览器,只能采用MimeUtility编码或ISO编码的中文输出else if (userAgent.indexOf("applewebkit") != -1) {try {new_filename = MimeUtility.encodeText(filename, "UTF8", "B");} catch (UnsupportedEncodingException e) {e.printStackTrace();}rtn = "filename=\"" + new_filename + "\"";}// FireFox浏览器,可以使用MimeUtility或filename*或ISO编码的中文输出else if (userAgent.indexOf("mozilla") != -1) {rtn = "filename*=UTF-8''" + new_filename;}}return rtn;}
基本能解决大部分浏览器中文显示不正常的情况,但是,浏览器还有版本的,所以最好的方式就是能不用中文的时候,尽量别用中文
附录:
按照文件扩展名排列的 Mime 类型列表
- 解决各大浏览器下载文件名显示不正确的情况
- 解决各大浏览器下载文件,文件名乱码的问题
- 各浏览器下载文件名乱码情况示例
- 【解决问题】文件名中含有中文,出现浏览器显示无法下载的情况
- 解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题
- 解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题
- 解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题
- 解决不同浏览器上中文文件名的下载乱码问题
- 解决火狐浏览器下载文件文件名乱码的问题
- 解决FlashFXP5 不能下载中文文件名文件的问题(显示文件名中文正常下载文件名是乱码)
- 后台框架左侧在IE9下显示不正确的解决及IE浏览器类型检测
- jsp 下载解决中文文件名显示问题
- 在浏览器端动态实现下载功能,界面上会显示下载的文件名
- 解决IE8不正确显示
- 解决浏览器间的不兼容问题---火狐正常显示,其他浏览器有问题的情况
- 用火狐浏览器下载中文文件名的文件乱码及其解决
- 用火狐浏览器下载中文文件名的文件乱码及其解决
- 用火狐浏览器下载中文文件名的文件乱码及其解决
- 稻草人的程序之路--构建简单散列表
- UITextView添加圆角边框
- 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始
- Jackson_Java和Json/XML互转的开源框架
- 自己动手学TCP/IP–tftp协议
- 解决各大浏览器下载文件名显示不正确的情况
- 在“Resources”参数中指定了项“obj\x86\Debug\frmLogin.frmLogin.resources”多次。“Resources”参数不支持重复项。
- 关于Hibernate在weblogic中使用查询的时候该页无法显示的问题解决
- JS学习笔记之客户端检测
- 给明年依然年轻的我们:道别150万年薪,开始盒饭生活-(转)
- 使用SVN命令行工具,svn下载,windows命令行下svn
- gcc链接外部函数库
- POJ 2352 Stars
- sqlite用命令来创建db数据库文件(初)