为什么HttpUtility.UrlEncode(HttpUtility.UrlDecode(“%20”))返回+而不是%20?

时间:2009-10-13 16:55:47

标签: asp.net encoding response

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

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

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,这就是我需要的。

5 个答案:

答案 0 :(得分:16)

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

您可以随时对其进行编码,然后在“+”上为“%20”执行直接字符串替换。我认为会起作用......

答案 1 :(得分:9)

  

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

这不是在带标题参数(如Content-Disposition-filename)中放置带外字符的正确方法,并且由于某个错误只能在IE中工作(有时)。实际上这是一个长期存在的问题:there is no right way

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

答案 2 :(得分:6)

引自this link

  

我自己也遇到过这种情况。如果你   能够将空格更改为%20s   然后IE7将正确转换它们。   Firefox虽然会采取它们   从字面上看(至少在使用时   Content-disposition header)所以你   将需要为来自的请求执行此操作   仅限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 + "\"");

答案 3 :(得分:2)

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

请查看最佳套房的链接并给出完整的答案。

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();

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

答案 4 :(得分:1)

还有一个选项,如果您可以通过以下方式获得有关Windows修补程序更新的客户:

Windows Hotfix Update for IE white space issue

它是客户端,因此可能不适用于所有方案,但如果可行,仍然是一个选项。