`
eddysheng
  • 浏览: 111783 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

文件下载时文件名在ie和firefox下面表现不一致问题

阅读更多
首先文件名是是以utf-8编码保存在数据库中,文件名暂定为1_中文文件123.txt,然后作如下处理来下载
response.setContentType("application/octet-stream;charset=UTF-8");
fileName=java.net.URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
此时在ie下面点击文件下载的时候能够正确显示中文名称1_中文文件123.txt%0A,但是文件名的结尾却出现%0A字符(个人猜测是结束符的utf-8编码);但是此时在firefox下面却显示1_%E4%B8%AD%E6%96%87%E6%96%87%E4%BB%B6123.txt%0A

然后我又试了另一种方案
response.setContentType("application/octet-stream;charset=UTF-8");
fileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
此时在ie下面下载的时候弹chu的文件名是乱码;而在firefox下面却正确显示1_中文文件123.txt。

我想要的是不管是ie还是firefox都正确显示1_中文文件123.txt,不知道大家有没有遇到过类似的问题,解决之道是什么?
也许判断浏览器类型来进行不同的处理会是一种解决方案,但是这是一种个人觉得迫不得已的解决方案。
分享到:
评论
11 楼 manyinjin 2007-04-27  
文件名过长的问题在IE7中依然存在。
10 楼 fins 2007-01-29  
究竟文件名过长时候出现什么问题呢?

我用这么个名字:
列表5345用户列表用户列表12323用户列表用列表5345用户列表用户列表12323用户列表用列表5345用户列表用户列表12323用户列表用户列表5345用户列表用户列表12323列表用户列表5345用户列表用户列表12323asdasdasd.xls

够长了吧?  在ie6 和 ff下都没有出现任何问题
不明白那个 截短文件的操作有什么用?
我看那个bug了 在ie5.01就解决了 我决定没有必要截取

否则结果就是 你为了迁就少部分的5.0用户  使得大部分的6.0的用户得不到完整的ie名,除非 你再判断一下ie版本 但是怎么判断ie是否已经打过补丁了呢? 即使是5.0版本 如果打了补丁 同样不会出现这个问题啊

9 楼 eddysheng 2007-01-29  
已经解决,方案如下:
private String processFileName(String fileName,String agent) throws IOException{
String codedfilename = null;
if (null != agent && -1 != agent.indexOf("MSIE")){  
String prefix = fileName.lastIndexOf(".")!=-1?fileName.substring(0,fileName.lastIndexOf(".")):fileName;
String extension = fileName.lastIndexOf(".")!=-1?fileName.substring(fileName.lastIndexOf(".")):"";
String name = java.net.URLEncoder.encode(fileName, "UTF8"); 
if(name.lastIndexOf("%0A")!=-1){
name = name.substring(0,name.length()-3);

int limit = 150 - extension.length();  
if (name.length() > limit) {    
name = java.net.URLEncoder.encode(prefix.substring(0, Math.min(prefix.length(), limit / 9)), "UTF-8"); 
if(name.lastIndexOf("%0A")!=-1){
name = name.substring(0,name.length()-3);

    }  

codedfilename = name + extension;  
} else if (null != agent && -1 != agent.indexOf("Mozilla")) { 
codedfilename = "=?UTF-8?B?"+(new String(org.apache.commons.codec.binary.Base64.encodeBase64(fileName.getBytes("UTF-8"))))+"?=";
}else {  
codedfilename = fileName;
}  
return codedfilename;
}
8 楼 eddysheng 2007-01-27  
可是这个仍然存在问题啊
1。ie文件名超长问题,可以通过crofton的方法解决。
2。ff下面文件名超长后,文件名就被自动截断了(包括文件扩展名也没了),虽然可以通过判断长度来处理,但是有没有更好的方法呢
7 楼 fins 2007-01-27  
我找到了更好的方法
	// 其中 Base64 类来自 org.apache.commons.codec 组件 一个40多k的jar 要比javamail里的那个简洁很多
	public static String encodeFileName(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
		String agent = request.getHeader("USER-AGENT");
		if (null != agent && -1 != agent.indexOf("MSIE")) {
			return URLEncoder.encode(fileName, "UTF8");
		}else if (null != agent && -1 != agent.indexOf("Mozilla")) {
			return "=?UTF-8?B?"+(new String(Base64.encodeBase64(fileName.getBytes("UTF-8"))))+"?=";
		} else {
			return fileName;
		}
	}

6 楼 eddysheng 2007-01-26  
String codedfilename = MimeUtility.encodeText(cfrfilename, "UTF8", "B");  
这段代码我是不是可以用
String codedfilename = new String(cfrfilename.getBytes("UTF-8"), "iso-8859-1");代替?  
5 楼 fins 2007-01-26  
crofton 写道
如果超过文件名超过 17 个中文字符,在 IE 下会有问题,详情请见:http://support.microsoft.com/?kbid=816868。下面是我专门给 IE 做的解决方案:
    /**
     * @author crofton@citiz.net
     * @param fileName name of downloaded file without extention
     * @param extension extension of downloaded file with dot character
     * @return encoded fileName for IE
     * @throws UnsupportedEncodingException never happened
     */
    public static String encodeFileName(String fileName, String extension) throws UnsupportedEncodingException {
        //UTF8 URL encoding only works in IE
        fileName = URLEncoder.encode(fileName, "UTF-8");
        //Bug of IE (http://support.microsoft.com/?kbid=816868)
        //Encoded fileName cannot be more than 150
        int limit = 150 - extension.length();
        if (fileName.length() > limit) {
            //because the UTF-8 encoding scheme uses 9 bytes to represent a single CJK character
            fileName = URLEncoder.encode(prefix.substring(0, Math.min(prefix.length(), limit / 9)), "UTF-8");
        }
        return fileName + extension;
    }



这个方法不能单独提出来用阿 那个prefix是什么?
还有那个extension参数是做什么的?
谢谢
4 楼 crofton 2007-01-26  
如果超过文件名超过 17 个中文字符,在 IE 下会有问题,详情请见:http://support.microsoft.com/?kbid=816868。下面是我专门给 IE 做的解决方案:
    /**
     * @author crofton@citiz.net
     * @param fileName name of downloaded file without extention
     * @param extension extension of downloaded file with dot character
     * @return encoded fileName for IE
     * @throws UnsupportedEncodingException never happened
     */
    public static String encodeFileName(String fileName, String extension) throws UnsupportedEncodingException {
        //UTF8 URL encoding only works in IE
        fileName = URLEncoder.encode(fileName, "UTF-8");
        //Bug of IE (http://support.microsoft.com/?kbid=816868)
        //Encoded fileName cannot be more than 150
        int limit = 150 - extension.length();
        if (fileName.length() > limit) {
            //because the UTF-8 encoding scheme uses 9 bytes to represent a single CJK character
            fileName = URLEncoder.encode(prefix.substring(0, Math.min(prefix.length(), limit / 9)), "UTF-8");
        }
        return fileName + extension;
    }

3 楼 fins 2007-01-26  
MimeUtility 这个类是哪里的呀??


找到了
使用到了JavaMail中的Base64编码的类MimeUtility.

有没有同样功能的 但是不在 javamail里 的类啊?
例如 commons-codec-1.3.jar 里有没有?
2 楼 eddysheng 2007-01-25  
thanks a lot
1 楼 codeutil 2007-01-25  
只能根据user-agent来:

http://forum.java.sun.com/thread.jspa?threadID=696263

http://www.blogjava.net/zamber/archive/2006/09/14/69752.html#Feedback

参考这两个:
String agent = request.getHeader("USER-AGENT");
if (null != agent && -1 != agent.indexOf

("MSIE"))
{
String codedfilename = URLEncoder.encode(cfrfilename, "UTF8");
response.setContentType(

"application/x-download");
response.setHeader("Content-Disposition","attachment;filename=" + codedfilename);


}
else if (null != agent && -1 != agent.indexOf("Mozilla"))


{    
String codedfilename = MimeUtility.encodeText(cfrfilename, "UTF8", "B");
response.setContentType("application/x-download"

);
response.setHeader("Content-Disposition","attachment;filename=" + codedfilename);
}


else 
{
response.setContentType("application/x-download");
response.setHeader("Content-Disposition",

"attachment;filename=" + cfrfilename);
}



相关推荐

    完整版用IE下载文件.rar

    7. **文件名“用IE下载文件”可能包含的内容**:这份压缩包可能包含了一个详细的图文教程,教用户如何解决在IE中遇到的下载问题,或者是一些与IE下载相关的辅助工具和设置建议。 8. **解压和使用**:收到“.rar”...

    firefox29安装文件

    用户只需运行此文件,按照提示完成安装过程,即可在Win8系统上享用Firefox 29,从而解决LoadRunner与IE8不兼容的问题。 总的来说,Firefox 29作为一个可靠的浏览器选择,不仅可以为用户提供一个与IE8不同的浏览体验...

    Java下载文件时文件名乱码问题解决办法

    在Java编程中,当涉及到文件下载时,可能会遇到文件名乱码的问题,尤其是在不同浏览器环境下。这通常是由于浏览器对文件名编码方式的理解不一致导致的。以下是对标题和描述中所述知识点的详细解释: 首先,我们需要...

    兼容IE,FireFox的浮动图片广告

    标题中的“兼容IE,FireFox的浮动图片广告”意味着这个技术解决方案主要关注的是在两种主流浏览器——Internet Explorer(IE)和Firefox上实现一致的浮动图片广告展示效果。在Web开发中,由于不同浏览器对HTML、CSS和...

    万年历-支持IE6.0版本以上、Firefox

    这在当时是一个重要的考虑因素,因为IE6.0尽管存在很多已知问题,但在某些企业环境中仍被广泛使用,而Firefox则是一个备受欢迎的替代选择。 从标签“支持IE6.0版本以上、Firefox”可以推断出,开发者可能使用了特定...

    右侧漂浮qq在线客服真正支持IE&火狐

    它强调了该系统能在两种主流浏览器——Internet Explorer(IE)和Firefox上正常工作,这表明设计者考虑到了跨浏览器兼容性的问题。 在网页设计中,"右侧漂浮"通常指的是网页右侧有一个可以随着用户滚动页面而始终...

    firefox,IE 都兼容字符强制换行

    标题提到的"firefox,IE 都兼容字符强制换行"是指在Firefox和Internet Explorer(IE)这两种主流浏览器上实现文本强制换行的技术。虽然这两款浏览器在处理某些HTML和CSS特性时可能存在差异,但可以通过一些方法来实现...

    Struts2下载文件中文乱码处理

    在Web开发中,使用Struts2框架进行文件下载操作时,经常遇到的一个问题是文件名中的中文字符显示为乱码。这主要是因为浏览器和服务器之间的编码不一致所导致的。为了确保用户能够正确地看到文件名中的中文字符,需要...

    IE FF通用的日历控件

    这个文件很可能是示例代码或教程,展示了如何创建一个能同时在IE6、IE7和Firefox中正常工作的日历控件。文件名表明,这个控件可能使用了HTML、CSS和JavaScript的混合技术,确保在所有指定浏览器中都能正确显示和操作...

    Banner广告图片 (兼容IE6-IE10 火狐 谷歌等浏览器的)

    这篇内容主要关注的是如何创建一个适用于多种浏览器的Banner广告图片,包括了较老版本的Internet Explorer(从IE6到IE10),以及Firefox和Google Chrome等现代浏览器。在Web开发中,考虑到不同浏览器对某些CSS、...

    兼容 多版本浏览器 ie

    1. **跨浏览器兼容性**:在Web开发中,确保网站或应用在Firefox、Chrome、Safari、Edge以及不同版本的IE等主流浏览器上都能正常工作,是一项基本任务。这是因为不同的浏览器可能对Web标准的支持程度不同,可能导致...

    解析如何在PHP下载文件名中解决乱码的问题

    在PHP中提供文件下载功能时,如何正确处理文件名以避免乱码问题是一个常见的技术难题。乱码通常是由于编码不一致导致的字符显示错误,当浏览器接收到包含非ASCII字符的HTTP响应头部信息时,可能会因为没有正确解释...

    跨浏览器PHP下载文件名中的中文乱码问题解决方法

    在PHP编程中,当涉及到跨浏览器的文件下载时,可能会遇到中文文件名显示为乱码的问题。这个问题主要是由于不同浏览器对文件名编码处理方式的差异所导致的。本文将详细介绍如何通过PHP解决这一问题。 首先,我们需要...

    JavaScript读二进制文件并用ajax传输二进制流的方法

    对于非IE浏览器(如Chrome、Firefox等),可以使用`FileReader` API,它提供了一个异步的方式来读取文件内容。`FileReader`的`readAsBinaryString`方法用于将文件读取为二进制字符串。需要注意的是,`...

    php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)

    然而,不同浏览器对MIME类型的检测可能存在不一致,比如IE和Firefox就可能会有差异。 为了确保兼容性和安全性,PHP开发者需要对上传的文件进行验证,以确保它们是预期的类型。这通常通过比较文件的MIME类型与预期的...

    KODExplorer 芒果云-资源管理器

    - 选中文件时,移动到屏幕可视区域(解决上下左右选中文件滚动条不一致问题) ###ver2.51 `2014/6/22` ---- ####fix bug:(bug解决和程序优化) - 登陆多次密码输入错误验证码bug解决 - 修复漏洞:创建副本加入...

    IE:如何使用断点续传功能

    断点续传是一种在互联网上下载文件时非常实用的功能,尤其在大文件传输过程中,能够有效地提高下载效率和用户体验。IE浏览器(Internet Explorer)自5.0版本开始引入这一特性,使得用户在下载过程中遇到网络中断或...

    仿126邮箱多文件上传

    4. **兼容性处理**:为了确保在IE和Firefox等不同浏览器下均能正常工作,使用了不同的CSS属性如`opacity`和`filter`来处理透明度问题。 #### 四、功能流程 1. **加载页面时**:页面首次加载时会自动调用`AddFiles...

Global site tag (gtag.js) - Google Analytics