如何在关闭的弹出窗口中提供(在IE和Firefox中)二进制文件下载?

时间:2009-05-07 13:34:59

标签: javascript internet-explorer firefox popup download

我需要针对以下用例的跨浏览器解决方案: 用户单击其中一个页面上的“导出”按钮,这将打开一个带有表单的弹出窗口。在提交表单时,用户应该接收二进制文件下载(例如,CSV文件),并且弹出窗口应该关闭而不更改父窗口的可见内容。

我们不能使用超时来关闭弹出窗口,因为通常会有一个对话框询问用户在下载文件之前如何处理文件,并且无法知道用户处理此对话框需要多长时间。

我们最初在弹出窗口中有一个脚本,它将window.location设置为下载文件URL。这让弹出窗口不受限制。

然后我尝试在父窗口中放置一个隐藏的iFrame,并在调用self.close()之前让弹出窗口将iFrame的src设置为下载URL。这在Firefox中完美运行,但IE完全破坏了安全限制。

有没有正确的方法呢?如何在IE上运行?


更新 - 问题已解决

这里提出的答案并不太远,但我的问题比仅仅是一个Javascript问题要复杂一些。我遇到了IE和Excel的错误(因为下载文件是CSV),弹出窗口正在进行表单发布。

如果没有将表单数据附加到URL(对于GET而不是POST)我无法解决问题,我必须在IE中将站点设置为受信任(这是一个企业应用程序,因此这是一个合理的请求使用户)。

单击表单按钮,弹出窗口调用window.opener上的函数,传入表单及其操作URL。然后弹出窗口调用window.close()。该函数将表单数据附加到URL并将window.location设置为新URL(iFrame构思在IE中从未运行良好,显然不是必需的)。

在对表单URL的响应中,请求标头包括Content-Type:application / octetstream和Content-Disposition“,”附件;文件名= filename.csv”。

3 个答案:

答案 0 :(得分:1)

您是否尝试过在iframe解决方案中实际调用父窗口内的方法,而后者又会设置iframe的位置?我问,因为它在我的测试中有效:

父窗口

<html>
<head>
<script type="text/javascript">
var w;

var download = function() {
    document.frames[0].location = "test.php";
    w.close();
};

var o = function() {
    w = window.open("test2.html", "window_name");
    return false;
};
</script>
</head>
<body>

<a href="#" onclick="return o();">open</a>

<iframe></iframe>

</body>
</html>

弹出窗口

<html>
<head>
<script type="text/javascript">
var download = function() {
    window.opener.download();
    return false;
};
</script>
</head>
<body>

<a href="#" onclick="return download();">download</a>

</body>
</html>

test.php 只是一个强制下载文件的页面,请注意上面的代码是IE特定的,因为我正在使用document.frames对象,但它很容易跨浏览器。

答案 1 :(得分:0)

这可能是解决问题的一种方法。

1)弹出窗体onsubmit会打开一个window.open到第三个窗口,打开一个页面,这个页面只返回下载的文件。

2)在弹出窗体上的javascript中,在你执行window.open之后,调用关闭弹出提交表单的父窗口(第一个窗口)方法。

3)在第三页(即返回文件的页面)上,您在头文件中的内容处置只返回文件而没有其他内容,因此页面不会真正打开。

以下是您可能需要的标题的一些信息。代码是经典史前ASP,但你应该能够发现你需要的东西。

http://classicasp.aspfaq.com/general/how-do-i-prompt-a-save-as-dialog-for-an-accepted-mime-type.html

希望有所帮助。

答案 2 :(得分:-1)

没有任何完美的解决方案。当文件下载IE浏览器弹出窗口并在firefox中直接下载