【问题标题】:Why does HttpUtility.UrlEncode(HttpUtility.UrlDecode("%20")) return + instead of %20?为什么 HttpUtility.UrlEncode(HttpUtility.UrlDecode("%20")) 返回 + 而不是 %20?
【发布时间】:2009-10-13 16:55:47
【问题描述】:

我在下载文件时遇到问题,下载时所有空格都替换为下划线。

基本上我在这里遇到了问题:

Response.AddHeader("Content-Disposition", 
    "attachment; filename=" + someFileName);

问题在于,如果 someFileName 中有空格,例如“check this out.txt”,那么系统会提示用户下载“check_this_out.txt”。

我认为最好的选择是对文件名进行 UrlEncode,所以我尝试了

HttpUtility.UrlEncode(someFileName);

但它用加号代替了空格,这让我很困惑。那我就试了

HttpUtility.UrlEncode(HttpUtility.UrlDecode("%20"))

解码工作正常并给了我一个空间,但编码占用了空间,然后再次给了我加号。

我在这里遗漏了什么,这是正确的吗?如果是这样,我应该如何正确地将空格编码为 %20,这是我需要的。

【问题讨论】:

    标签: asp.net encoding response


    【解决方案1】:

    基本上 %20 和 + 都是编码空格的有效方法。显然,UrlEncode 方法必须选择一个选项...如果它选择另一种方式,其他人会问为什么UrlEncode(UrlDecode("+"))返回“%20”...

    您总是可以对其进行编码,然后只需在“+”上直接替换“%20”即可。我认为会起作用...

    【讨论】:

    • 谢谢乔恩。我看到的问题是,由于它选择使用 +,我的文件显示为“check+this+out.txt”而不是空格,这是我想要实现的目标。
    • @Joseph:正如乔恩所说,“”被“+”代替;当您尝试转义“+”时,您将使用“%2B”
    • @Rubens 我明白,但这仍然不能解决我的问题。要么我对其进行编码,我的文件最终被称为“check+this+out.txt”,或者我不对其进行编码,它被称为“check_this_out.txt”。如何让它正确显示空白?
    • 好的,所以 5 年后,UrlEncode 使用 '+' 但 IIS 7 默认拒绝 '+' 符号。在服务器端代码中创建 URL 时,解决这种冲突的正确方法是什么?做第二遍并用 %20 替换 + 符号?
    • 谢谢,我的 IE 11 也有这个问题,Jon 的解决方案对我有用。但请注意,首先设置 UrlEncoding,然后替换,例如:'Title.UrlEncoded.Replace("+", "%20")' 对我有用,但不是 'Title.Replace("+", "%20 ").UrlEncoded'
    【解决方案2】:

    我认为最好的选择是对文件名进行 UrlEncode

    这不是将带外字符放入诸如 Content-Disposition-filename 之类的标头参数中的正确方法,并且由于错误而仅(有时)在 IE 中有效。实际上这是一个长期存在的问题:there is no right way.

    如果您需要在下载的文件名中添加特殊字符,则无法使用 Content-Disposition-filename 可靠地执行此操作。相反,从 Content-Disposition-attachment 标头中省略“文件名”参数,并将所需的文件名留在 URL 的尾部。在没有文件名参数的情况下,浏览器将从 URL 路径中获取它,其中 URL 编码 是处理特殊字符的正确方法。

    【讨论】:

      【解决方案3】:

      引用this link

      我自己也遇到过。如果你 能够将空格更改为 %20s 然后 IE7 将正确转换它们。 Firefox虽然会接受它们 从字面上看(至少在使用 内容处置头)所以你 将需要为来自的请求执行此操作 仅限 IE7。

      我们在应用中执行了以下操作。 ( 一种 基于tomcat的文档库)

      String userAgent = request.getHeader("User-Agent");
      if (userAgent.contains("MSIE 7.0")) {
          filename = filename.replace(" ", "%20");    
      }         
      response.addHeader("Content-disposition",
          "attachment;filename=\"" + filename + "\"");
      

      【讨论】:

      • 谢谢,我在其他地方的另一篇文章中找到了这个,与你的解决方案相同。我可能最终不得不这样做,但这对我来说是错误的/肮脏的。哦,好吧。
      【解决方案4】:

      您好,我在下载包含空格的文件时也遇到了同样的问题。

      请查看最适合并给出完整答案的链接。

      http://kb.mozillazine.org/Filenames_with_spaces_are_truncated_upon_download

      为了便于理解,我只是添加了如何解决这个问题的 ASP.net 代码。

      string document = @"C:\Documents and Settings\Gopal.Ampolu\My Documents\Downloads\" + "Disciplinary & Grievance Procedures..doc";
      string filename = "Disciplinary & Grievance Procedures..doc";
      
      Response.ContentType = mimeType;
      Response.AddHeader("Content-Disposition", @"attachment; filename=""" + HttpUtility.UrlDecode(filename) + @"""");
      Response.Flush();
      

      从上面可以看出,在响应中添加 header 时,文件名用双引号括起来。 请确保“文件名”必须使用 UrlDecode 解码。

      【讨论】:

        【解决方案5】:

        还有一个选项,如果您可以在以下位置告知客户有关 Windows 修补程序更新的信息:

        Windows Hotfix Update for IE white space issue

        它是客户端,因此可能不适用于所有场景,但如果可行,仍然是一种选择。

        【讨论】:

          猜你喜欢
          • 2017-10-07
          • 2010-09-18
          • 1970-01-01
          • 2015-11-15
          • 1970-01-01
          • 1970-01-01
          • 2015-11-14
          • 1970-01-01
          • 2019-08-17
          相关资源
          最近更新 更多