如何下载通过post生成的php文件,同时避免页面位置发生变化?

时间:2018-03-24 10:02:48

标签: javascript php html ajax download

我有一个文件download.php,我通过帖子提供数据,然后通过设置标题

生成一个svg文件进行下载
header('Content-Type: application/svg+xml');
header("Content-Disposition: attachment; filename=\"myfilename\"");

现在,问题是如何启动下载。我的第一次尝试是将数据放入表单并通过帖子

提交
<form id="svgform" method="post" action="download.php" style="display: none;">
    ...
</form>

通常,这很好用。它不会更改download.php的位置,只会启动下载。不幸的是,这个方法似乎有一个警告(在极少数情况下)php请求生成错误(无论出于何种原因),页面被更改。我想不惜一切代价避免页面更改(因为未保存的数据可能会丢失)。它还有一些其他奇怪的副作用[1]。

所以,接下来我尝试通过

在新标签中启动下载
<form id="svgform" method="post" target="_blank" action="download.php" style="display: none;">
    ...
</form>

这会导致在下载开始之前出现一个丑陋的白页。更糟糕的是,在IE 11中,白页没有关闭,下载对话框落在上一页上,因此用户没有立即看到它。

所以,我想知道最好的方法是什么。可以通过AJAX更好地实现下载吗?

[1]由于某种原因,Firefox之前打开检查器时无法生成html检查器数据。这是一种了解我的意思的方法。检查Firefox中的某些元素并使检查器保持打开状态。现在,转到通过上述方法(或类似方法)下载数据的页面,例如http://download.cnet.com/CCleaner/3001-18512_4-10315544.html。检查员变空,不再检查任何元素。此外,我的一些脚本在IE 11中停止正常工作。我不确定为什么它可能与Firefox中发生的事情有关。

1 个答案:

答案 0 :(得分:1)

由于您不希望在发布表单时更改网址但仍希望开始下载,因此您可以将表单发布为iframe。

<form target="my-iframe-id" method="post" ... >

和iframe:

<iframe id="my-iframe-id" ... ></iframe>

您可以将iframe设置为display: none;,这样就不会显示。