IE 7的bug?-下载文件时提示保存/打开-C# ASP.NET 3.5

7
我有一个包含链接按钮的aspx页面,这些按钮会触发JavaScript来打开一个新的aspx页面,以向用户流式传输文件以供下载。
在XP SP3、IE 7和FireFox 3.5上开发和单元测试时,使用以下代码(关键是Content-Disposition标记中的“attachment”部分),两者都会弹出对话框询问我是否要保存或打开文档,这正是我想要发生的。
        private void WriteFileToBrowser(Byte[] requestFile, string filename, String m_mimeType, String m_format)
    {
        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment;filename=" + filename + "." + m_format);
        Response.ContentType = m_mimeType;
        Response.BinaryWrite(requestFile);
        Response.Flush();

    }

当我将此部署到Windows 2003服务器并导航到相同的aspx页面时,FireFox 3.5会如预期地正确要求保存/打开选项,因为这是FF中的默认操作。但是,在IE 7中导航并单击下载时,我会看到一个弹出窗口,最多可见1/8秒...然后消失了。没有提示保存/打开。如果我进入IE 7 -> 工具 -> Internet选项 -> 安全 -> 自定义级别 -> 下载,自动提示文件下载被禁用。当我勾选启用时,Save/Open提示就能正常工作了。所以我的问题是......有人找到解决方法吗?我已经尝试了许多人声称使用不同的Header标签(如cache、pragma等)来解决,但都无法避免IE默认禁用下载属性的事实。

我尝试过类似的东西,它在IE7、8中可以工作。你能提供你使用的m_mimeType的确切值吗? - o.k.w
"用于测试,我在参数列表中使用这个作为 MIME 类型和格式:""application/pdf","PDF" - Boom Shaka Laka
你试过其他的吗,比如application/zip? 这是IE7无法在其窗口内显示的内容。 - o.k.w
还没有。我调用了一个WCF方法来检索字节,而该系统目前仅存储PDF文件,并且他们告诉我他们的软件目前无法转换任何其他文件类型。真糟糕。 - Boom Shaka Laka
微软提供IE7、IE6和IE8虚拟机,您可以看到发生了哪些变化。 - Ry Jones
5个回答

2
最近在我们自定义的网页框架中,下载生成报告时遇到了完全相同的问题。研究后尝试了您提到的方法(设置Content-Disposition)。
该问题与IE7和安全区域有关。默认情况下,某些操作必须由用户明确启动。您可以从理解和使用受保护模式Internet Explorer关于窗口限制开始查找。

1

如果您将您的页面添加到受信任的站点中,您就可以下载该文件。 在开发所有网站时,您运行的所有网站都在此区域中。

您可以尝试通过添加来强制使用Internet Explorer

HttpContext.Current.ApplicationInstance.CompleteRequest();

到您的请求的末尾。

否则,您可以尝试发布文档链接,这样浏览器就会将请求视为用户交互的响应。


0
如果不是必须使用JavaScript打开新页面,您可以使用Response.Redirect()方法来跳转到aspx页面。这样应该会打开保存/打开对话框。

0

试试这个

protected void Button1_Click(object sender, EventArgs e) { Response.ContentType = "application/pdf"; Response.Clear(); Response.TransmitFile("test.pdf"); Response.End(); }


如果您看我的例子,文件不是来自文件系统,而是一个字节数组,我使用BinaryWrite()将其写入浏览器。在这种情况下,除非我在系统上物理组装文件,否则TransmitFile()将无法工作。 - Boom Shaka Laka

0

虽然与此问题无关,但您需要在输出中引用文件名。文件名中的空格会导致下载文件时出现问题。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接