7

下载带有 Response.Write 的文件时,文件名中的空格被替换为下划线,并且当关联的应用程序打开时,会附加方括号中的数字:

Response.AppendHeader("Content-disposition", "attachment; filename=this is the file.xml");
Response.Write(dr["InfopathDoc"]);

这会在关联的应用程序中生成此文件名:

这个_is__文件[1].xml

我怎样才能摆脱下划线,为什么我会得到 [1] ?

谢谢

4

6 回答 6

7

在这里找到了这个问题的解决方案

http://dotnetslackers.com/Community/blogs/kaushalparik/archive/2009/05/06/file-download-problem-filename-with-spaces-truncated-in-ff-and-replaced-by-underscore-in-即.aspx

要解决 FF 的问题,请在文件名周围添加引号作为

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

对于 IE,用 '%20' 替换空格

文件名 = toDownload.Name.Replace(" ", "%20");

于 2009-10-22T15:25:30.210 回答
4

如果有人仍然感兴趣:

这种文件名重写仅由浏览器完成,您可以在使用适当的工具检查接收到的 HTTP 响应时看到,而与使用的浏览器无关。IE 首先将请求的文件下载到其“Temporary Internet Files”文件夹系统(这不仅仅是一个,但这是另一个主题),为此文件接收一个新名称,与“Content-Disposition”最匹配来自 HTTP 响应的建议。但是,如果实际中已经存在同名文件“Temporary Internet Files”文件夹实际用于该文件,其名称由括号中的序号扩展,如“[2]”。因为每个新的 HTTP 请求都会导致 IE 缓存机制重新计算实际的缓存文件夹,并且选择的下一个缓存文件夹可能还没有包含具有该名称的文件,所以该数字可能会在下一次下载文件或资源时消失同名。

如果下载的文件存储在某处,则通常会再次使用最初建议的文件名,具体取决于 IE 版本。某些版本和补丁级别似乎使用缓存文件夹文件名 :-(

当浏览器将下载的文件分发给选定或自动选定的应用程序时,问题开始变得烦人。在这种情况下,调用应用程序直接从缓存中打开文件,这至少有两个原因是不好的:

(1) 文件名将是缓存文件夹中文件的名称,而不是建议的名称。这甚至可能会剥离扩展名,这会使某些应用程序感到困惑,即使它们已被选择用于正确处理文件。

(2) 如果互联网新手用户下载并打开一个文件进行编辑,然后简单地按应用程序的“保存”按钮,该文件只是简单地保存到 IE 缓存文件夹中,这种用户永远不会找到该文件再次。这些事情会让人们非常愤怒和绝望......

于 2010-09-14T14:18:27.613 回答
4

网上有一些针对此类问题的解决方案。并非所有解决方案都适用于所有浏览器,但某些解决方案至少可以保证“保存结果”,尽管它们不能为所有客户端保留最初的“建议”文件名:

第一眼:

内容处置:附件;文件名=我的新文档.pdf;

FF36:显示下载文件“My” :-( IE6:显示“My New Document.pdf”,但打开时可能显示为“My New Document[1].pdf”。IE8:显示“My_New_Document.pdf” , 但也可以附加“[1]”作为 IE6。 ATTN:保存文档时,IE 会保留显示的名称,无论它在直接打开时向所选应用程序提供什么!

第一个改进:

内容处置:附件;filename="我的新文档.pdf";

FF36:按预期工作,即呈现“My New Document.pdf”。IE6+IE8:没有变化,和以前一样。

第二个变化:

内容处置:附件;文件名="我的%20New%20Document.pdf";

(用 %20 替换空格,就像在 URL 编码中一样,并保留双引号。)

FF36:显示发回的内容,即“My%20New%20Document.pdf”。不太好。IE6+IE8:显示“My New Document.pdf”,但分发“My%20New%20Document.pdf”。

第三变体:

内容处置:附件;文件名=我的%20New%20Document.pdf;

(删除双引号,但保留 %20。)

FF36:如上所述——不好。IE6+IE8:同上——也不是很好。

结论:

似乎至少所提出的方法并不能永远解决问题:它们既没有涵盖 1 个浏览器的所有情况,也没有涵盖任何相同选定情况的所有浏览器。

对我来说,最好的结果似乎是用双引号括起来:对于 FF36 和 IE6 有效,对于 IE8(可能对于 IE7),它至少与下划线稳定,即下载和保存渲染相同的文件名下载并打开,除了我们无法阻止的“[1]”。

最后的评论

有人说圣埃克苏佩里的小国王“小王子”说,当一个皇帝要求根本不可能的事情时,他不能真的期望他的人民跟随,导致他命令太阳升起和落下。自然而然地会这样做。就像本王在他的小行星越来越加速旋转时遇到麻烦一样,这些人已经放弃了,只是在服务器端添加了下划线。:-)

但是关于这个主题的 RFC 以及浏览器实现者提供的内容有时很难克服。

于 2010-09-14T15:13:35.783 回答
0

您是否尝试像在 url 中那样用“%20”(没有双引号)替换空格?

但是您应该考虑避免文件名中的空格(在 url 中)。

于 2009-03-09T09:16:19.483 回答
0

在对输出进行 HTMLEncoding 之后,您不应该使用 Response.Output.Write() 吗?:

Response.Output.Write(Server.HtmlEncode(Convert.ToString(dr["InfopathDoc"])));

编辑:文件名后面的下划线和 [1] 表明它是从 Internet 临时文件夹中加载的。没有足够的信息来推断为什么会发生这种情况,但也许这些信息会为您提供线索。

于 2009-03-09T09:21:35.837 回答
0

显然这是 IE7 的问题,需要修补程序:http: //support.microsoft.com/kb/952730/en-us

仍然不知道附加的数字 - 我想可能是因为 IE 临时下载文件夹中已经存在同名文件,但事实并非如此。

于 2009-03-09T10:11:50.413 回答