PHP文件下载完成事件

时间:2012-08-14 11:51:09

标签: php download

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

3 个答案:

答案 0 :(得分:2)

据我所知,无法知道用户何时完成下载。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

为什么不让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作为“下载完成” 然后注意syslog并运行脚本,

说下载完成,下载似乎~1900KB / 2000KB 它可能是一个铬问题,但你可以使用睡眠(3);并且在删除文件之前等待3秒以确保没有问题。

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

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