在我们的ASP.NET网站中,我们开发了一个允许用户下载文件的aspx页面。文件路径作为参数发送,然后读取文件内容并将其写入响应流。我们使用的代码如下:
string filepath = HttpContext.Current.Request.Params["FilePath"];
Response.Clear();
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(filepath));
Response.TransmitFile(filepath);
Response.Flush();
在我们的开发环境中,一切都按预期工作,但是当我们在生产服务器中使用这段代码时,我们注意到在尝试下载几乎所有类型的文件时,浏览器中没有任何反应。它只是为该aspx页面打开一个新窗口,但它几乎立即关闭。这是非常奇怪的,因为我们尝试下载.pdf,.doc,.xls,.txt和图像文件没有运气,除了一些(不是全部).msg文件。
我们一直在寻找嗅到与Fiddler一起到达浏览器的HTTP流量的线索,但我们看到的并不奇怪。在所有情况下,文件内容都会发送到浏览器,没有任何差异,所以似乎浏览器没有显示打开/保存/取消对话框。
以下是浏览器中收到的包含失败文件的标头示例:
HTTP / 1.1 200 OK代理连接: 保持活跃的联系:保持活力 内容长度:421395 Via:1.1 IBISA01日期:2011年1月26日星期三 格林威治标准时间12:02:54内容类型: application / octet-stream服务器: Microsoft-IIS / 7.5缓存控制: 私人内容 - 处理: 附件;文件名= P08-0656 Interflex EspecificaciónInterfaceSGA ERP 版本0.1.pdf X-AspNet-版本: 4.0.30319 X-Powered-By:ASP.NET
这些是可以下载的文件的标题:
HTTP / 1.1 200 OK代理连接: 保持活跃的联系:保持活力 内容长度:290816 Via:1.1 IBISA01日期:2011年1月26日星期三 格林威治标准时间12:03:29内容类型: application / octet-stream服务器: Microsoft-IIS / 7.5缓存控制: 私人内容 - 处理: 附件;文件名= Acalaracion final Fichero ascii provedores Interflex.msg X-AspNet-版本: 4.0.30319 X-Powered-By:ASP.NET
在所有情况下,文件的完整内容都显示在标题之后,显然没有与编码相关的问题。
我们想知道是否有可能调试或跟踪Internet Explorer活动,以了解拒绝下载文件的原因。
Web服务器具有Windows Server 2008 R2和IIS 7.5。我们使用的浏览器是基于Windows 7的IE 8.0。
非常感谢提前。
Jose Antonio Arroba答案 0 :(得分:2)
我们在pdf上遇到了类似的问题,请尝试添加此内容。
Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "no-cache");
修改实际上它与您的文件名有关:
How to encode UTF8 filename for HTTP headers? (Python, Django)
尝试从不起作用的示例中删除ó
答案 1 :(得分:1)
最后,我们能够在尝试下载文件时看到Internet Explorer中这种奇怪行为发生了什么。我忘了提到我们试图从Silverlight应用程序下载该文件,该应用程序调用一个aspx页面负责在其响应中写入文件内容。似乎Internet Explorer的安全引擎将此行为视为自动下载,并在从非Intranet服务器浏览时默认阻止它。
在Internet Explorer的Internet Explorer安全设置中启用“自动提示文件下载”设置解决了该问题。令我们困惑的是为什么在启用此设置之前我们能够下载一些文件。
非常感谢所有试图帮助我们的人。希望这个答案可以节省那些可以在未来体验同样优点的人的时间。
致以最诚挚的问候,
Jose Antonio Arroba答案 2 :(得分:0)
为每个案例尝试一下......
Dim strExtension as String = ""
Dim strType as String = ""
strExtension = Path.GetExtension(filepath)
Select Case strExtension.ToUpper()
Case ".PDF"
strType = "text/pdf"
Exit Select
CASE ".DOC"
strType = "text/doc"
Exit Select
End Select
Response.Clear()
Response.ClearHeaders()
Response.Buffer = True
Response.ContentType = strType