zoukankan      html  css  js  c++  java
  • 转载:终极解决下载文件名乱码

    今天做文件下载功能模块,发现几个问题。

    1.    如果指定的文件名里包含了空格,FireFox就会截取空格前的部分作为默认文件名,IE就会在空格位置通过+号填补

    2.    中文字符乱码,准确的是非 ASCII 字符乱码,当原文件的文件名中含有非 ASCII 字符时,将引发客户端获取到的文件名错乱

    3.     一些特殊字符不能被正常输出(当然这里我并不是那些不常见的符号)比如“.”在IE下就会变为“[1].”

     

    对于这三个问题,网上解决方案已经很多了,但没有一个完整的可以解决这些问题

    要不就是解决了空格问题,但如果有中文了,就出现了乱码。要不就是解决了中文了,空格就变成“+”了等等………

    有人说解决第一个问题解决方法很简单:用双引号把文件名括起来:

     Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    Response.ContentType = "application/octet-stream";

    这样做还是会有问题的,在IE中,如果文件名包含两个'.'的话,它会在第一个点前自动加个"[1]",于是你原来的文件名" Microsoft.App.zip"就变成了" Microsoft[1].App.zip "

    出现这个问题的原因是微软IE中的BUG(微软的说明 )

    对于这个BUG,可以通过下面的方法解决

     
    1 if (Request.Browser.Browser.Contains("IE"))
    2 {
    3 string ext = fileName.Substring(fileName.LastIndexOf('.'));
    4 string name = fileName.Remove(fileName.Length - ext.Length);
    5 name = name.Replace(".", "%2e");
    6 fileName = name + ext;
    7 }
    8 Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
    9 Response.ContentType = "application/octet-stream";
     

    但这样解决的前提是文件名称中不能有中文,还是很有局限性啊。

    到这是估计有人想说了,为何不用URL编码文件名称(HttpUtility.UrlEncode(fileName , System.Text.Encoding.UTF8)))。这个我最早的时候就试过了,通过编码后,空格全部成了+号了,当然这样做也就是解决了中文乱码问题,结果显示的还是很不满意

    最后通过google,终于找到老外的一编文章:Display a non-US-ASCII filename in File Download dialog box

    以下是他的代码

    按 Ctrl+C 复制代码
    按 Ctrl+C 复制代码

    通过他这段代码,我们可以解决掉两个问题,一个是中文乱码问题,还有一个是文件名中出现空格的问题,但第三个问题还在困扰着我们,这该怎么办了。难道真的没有完美的解决办法吗?
    答案是否定的,我们通过以上代码的总结,会发现,将其稍微结合一下,这三个问题就都迎刃而解了。

    以下是我给出的解决方案:

     
     1     string encodefileName=ToHexString(fileName);       //使用自定义的
    2 if (Request.Browser.Browser.Contains("IE"))
    3 {
    4 string ext = encodefileName.Substring(encodefileName.LastIndexOf('.'));//得到扩展名
    5 string name = encodefileName.Remove(encodefileName.Length - ext.Length);//得到文件名称
    6 name = name.Replace(".", "%2e"); //关键代码
    7 fileName = name + ext;
    8 }
    9 else
    10 {
    11 filename = encodefileName;
    12 }
    13 Response.AppendHeader("content-disposition", "attachment;filename=" + fileName );
     

    通过这样处理以后,不管是什么样的文件名称都可以解决掉乱码问题。该方式以通过测试,类似于“中国.黑客 Doc.v1.0.zip”这类文件名,IE,Chrome测试无压力,其它还未测试。如果有兴趣大家可以在各种浏览器上测试一下。还请大家多提意见

  • 相关阅读:
    14.18 InnoDB Backup and Recovery 备份和恢复:
    14.18 InnoDB Backup and Recovery 备份和恢复:
    php使用 _before_index() 来实现访问页面前,判断登录
    php使用 _before_index() 来实现访问页面前,判断登录
    查询方式实例演示
    查询方式实例演示
    haproxy timeout server 46000 后台超时时间
    haproxy timeout server 46000 后台超时时间
    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
    14.10.5 Reclaiming Disk Space with TRUNCATE TABLE 回收空间使用TRUNCATE TABLE
  • 原文地址:https://www.cnblogs.com/mushaobai/p/2479904.html
Copyright © 2011-2022 走看看