HttpResponse用下划线代替文件名中的空格

时间:2009-03-09 09:11:35

标签: response.write

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

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

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

_is _ {的{1}}文件[1]的.xml

如何摆脱下划线,为什么我会得到[1]?

由于

6 个答案:

答案 0 :(得分:6)

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

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

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

  

Response.AddHeader( “内容处置”,   “attachment; filename = \”“+ filename +   “\”“);

对于IE,请将空格替换为'%20'

  

filename = toDownload.Name.Replace(“”,“%20”);

答案 1 :(得分:4)

如果有人仍然感兴趣:

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

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

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

(1)文件名将是缓存文件夹中文件的名称,而不是建议的名称。这甚至可能剥离扩展,即使已经选择正确处理文件,也会使某些应用程序混淆。

(2)如果互联网新手用户下载并打开文件进行编辑,然后只需按下应用程序的“保存”按钮,该文件就会被保存到IE缓存文件夹中,此类用户将永远不会再次找到此文件。这些东西可以让人真正生气和绝望......

答案 2 :(得分:4)

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

第一眼:

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

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

第一项改进:

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

FF36:按照假设工作,我。即介绍“我的新文档.pdf”。 IE6 + IE8:没有变化,就像以前一样。

第二次改变:

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

(将%空格替换为%20,与URL编码一样,并保留双引号。)

FF36:显示已发回的内容,即“我的%20New%20Document.pdf”。不太好。 IE6 + IE8:呈现“我的新文档.pdf”,但是发出“我的%20New%20Document.pdf”。

第三种变化:

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

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

FF36:如上所述 - 不太好。 IE6 + IE8:如上所述 - 也不是那么好。

结论:

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

对我来说,最好的结果似乎可能是周围的双引号:对于FF36和IE6有效,对于IE8(可能对于IE7),它至少与下划线稳定,i。即下载&保存呈现与下载相同的文件名。打开,除了“[1]”,我们无论如何也无法阻止。

最后的评论

有些人和Saint-Exupérys的小王“小王子”一起去了,他说皇帝不能指望他的人民在他要求什么是根本不可能的时候跟随,导致他命令太阳升起并设定就在它自然恰巧的时候。就像这个国王在他的小行星越来越多地加速旋转时遇到麻烦一样,这些人已经放弃了,只是在服务器端添加了下划线。 : - )

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

答案 3 :(得分:0)

您是否尝试使用“@ 20”(没有双引号)替换空格,如在网址中?

但你应该考虑avoid spaces in filenames(在网址中)。

答案 4 :(得分:0)

在HTMLEncoding输出后,你不应该使用Response.Output.Write()吗? :

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

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

答案 5 :(得分:0)

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

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

相关问题