取消长运行下载

Cancel long running download

我在 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);

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

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

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

除了通过 Internet 浏览器的下载管理器手动取消下载之外,还有其他方法可以完全中止下载吗?

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

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

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();
}