2012-08-14 113 views
0

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

+0

可能重复的http://计算器。 com/questions/4905664/detect-if-download-is-complete,http://stackoverflow.com/questions/1563187/check-if-download-is-completed – Adi 2012-08-14 11:57:24

+0

已经回答: http:// stackoverflow.com/questions/1106377/detect-when-browser-receives-file-download – thedethfox 2012-08-14 11:58:37

+0

http://stackoverflow.com/questions/1563187/check-if-download-is-completed – 2012-08-14 12:03:40

回答

2

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

我将文件存储在单独的队列中删除它们经过一定的时间已经过去(1H和1D之间的事情)

+0

如果一个坏家伙做同样的事情和服务器满员服务器的内存呢? – user1485518 2012-08-15 09:14:58

+0

即使您在用户完成下载时删除文件,您也有同样的问题。 i.E.坏人模拟一个缓慢的连接或禁用响应,告诉你关于完成的下载。 如果您害怕有人滥用系统,您应该考虑采用其他方式分发下载文件(也许可以将每封电子邮件的链接发送给注册用户,然后每小时只发送几个文件) – wodka 2012-08-15 14:45:35

0

如果你正在处理下载在PHP中,你可以使用ignore_user_abort()来在连接断开的情况下让脚本继续运行,并在发送数据块时检查connection_aborted()。如果在所有块被设置之前发生中止,则下载失败。由于Web服务器缓冲PHP输出,因此不能保证传输真的已经结束。

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

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 

注意: 在我的测试中,我并没有删除,而不是我给输出到系统日志为“下载完成” 然后查看系统日志和运行脚本,

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

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

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

+0

如果文件很大,你不知道要等多久? – user1485518 2012-08-15 09:13:53