16

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

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

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

4

5 回答 5

16

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

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

于 2009-10-13T16:59:50.017 回答
9

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

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

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

于 2009-10-13T18:09:51.913 回答
7

从此链接引用

我自己也遇到过这个。如果您能够将空格更改为 %20s,那么 IE7 将正确转换它们。Firefox 虽然会按字面意思理解它们(至少在使用 Content-disposition 标头时),所以您只需要对来自 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 + "\"");
于 2009-10-13T17:24:17.020 回答
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 解码。

于 2011-01-27T10:04:38.577 回答
1

如果您可以在以下位置向客户提供有关 Windows 修补程序更新的信息,那么还有另一种选择:

针对 IE 空白问题的 Windows 修补程序更新

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

于 2013-08-01T09:51:39.783 回答