取消长时间运行下载

时间:2015-01-09 21:59:30

标签: javascript php iframe nginx abort

我在NGINX上有一个带有PHP服务器端语言的Web应用程序。通过JS,用户能够从非常慢的数据库下载由PHP动态构造的文件。因此,接收打印的第一个字节大约需要20秒。然后,之后不断传输更多数据。

PHP:

header("Content-Disposition: attachment; filename=\"" . $filename . ".txt\"");
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Set-Cookie: fileDownload=" . $filename . "; path=/");   

while (Stream::MORE_DATA == $client->receive($data)) {
   print $data;
   flush();
}

此下载是通过iframe进行的(由于其他原因,它必须保留为iframe):

iframe = document.createElement("iframe");
iframe.style.display = "none";
iframe.src = downloadFileUrl;
(document.getElementsByTagName("body")[0]).appendChild(iframe);

如果用户想要在新窗口中导航到另一个页面,则在下载完成之前不会加载另一个页面,因为NGINX一次只提供一个请求(我认为)。所以我为用户启用了取消下载的方法:

iframe.contentWindow.stop();
iframe.parentNode.removeChild(iframe);

如果在打印文件的第一部分之前的最初20秒内取消下载,则此操作成功。但是,如果在第一次打印后取消,即使iframe无效,该文件仍会继续下载。

除了通过互联网浏览器的下载管理器手动取消下载之外,还有另一种方法可以完全中止下载吗?

也许这可以通过JavaScript,PHP或NGINX配置更改来解决?谢谢!

1 个答案:

答案 0 :(得分:0)

所以我仍然无法找到一种方法来取消浏览器下载管理器中出现的已启动的下载。但是,在session_start之后使用session_write_close将允许避免这些并发问题,因此,可以同时运行多个PHP脚本(即,当用户在不同窗口中导航页面时仍然可以进行下载)

header("Content-Disposition: attachment; filename=\"" . $filename . ".txt\"");
header("Pragma: public");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Set-Cookie: fileDownload=" . $filename . "; path=/");   

session_write_close();
while (Stream::MORE_DATA == $client->receive($data)) {
   print $data;
   flush();
}