PHP 文件下载完成事件


PHP file download complete event

我正在动态创建用户应该下载的zip文件,下载完成后我想删除该文件。我认为所有JS方式都不安全。所以 php 它是一种服务器端语言,这让我认为在某种程度上,该客户端和我的服务器字节之间必须不再传输,所以我可以说现在下载已完成。有没有类似的方法来完成我上面描述的?

我所知,没有办法知道用户何时完成下载。

我会将文件存储在单独的队列中,并在经过一定时间后删除它们(介于 1h 和 1d 之间)

你为什么不让php来处理下载呢?

//you may need setting php runtime limit to zero.
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
$filename = "myfile.zip";
$file = file_get_contents($filename);
echo $file;
//download complete
unlink($filename); //delete file

通知:在我的测试中,我没有删除,而是将输出提供给 syslog 作为"下载完成"然后监视系统日志并运行脚本,

它说下载完成,因为下载似乎~1900KB/2000KB这可能是一个 Chrome 问题,但您可以使用 sleep(3);并在删除文件之前等待 3 秒钟,以确保没有问题。

编辑:即使下载因任何原因失败,此脚本也会删除该文件。您可能需要为每次下载尝试创建文件。我会选择:

1-创建文件2-用户下载/失败3-删除文件4-如果用户想再次下载:转到1

如果你在 PHP 中处理下载,你可以使用 ignore_user_abort() 在连接中断时保持脚本运行,并在以块的形式发送数据时检查 connection_aborted()。如果在设置所有区块之前发生中止,则下载失败。由于 Web 服务器缓冲了 PHP 输出,因此无法保证传输确实已结束。

另一种可能的方法是设置一个管道式 Apache 日志,该日志将事件通知发送到 PHP 脚本。即使下载不是由 PHP 本身处理,这也将起作用。我相信 Apache 不会将请求标记为已完成 HTTP 200,除非服务器收到 TCP/IP 确认,表明最后一个数据包已安全到达。