用户下载后删除文件

我正在使用这个发送文件给用户

header('Content-type: application/zip'); header('Content-Length: ' . filesize($file)); header('Content-Disposition: attachment; filename="file.zip"'); readfile($file); 

我想在用户下载后删除这个文件,我该怎么做?

编辑:我的情况就是这样,当用户点击下载button,我的脚本将创build一个临时的zip文件,用户下载它,然后该临时zip文件将被删除。

编辑2:确定最好的办法似乎运行一个小时清理临时文件的cron作业。

编辑3:我testing我的脚本unlink ,它的工作,除非用户取消下载。 如果用户取消下载,则zip文件保留在服务器上。 所以现在已经足够了。 🙂

编辑4:哇! connection_aborted()取得了诀窍!

 ignore_user_abort(true); if (connection_aborted()) { unlink($f); } 

即使用户取消下载,也会删除该文件。

 unlink($filename); 

这将删除该文件。

它需要与ignore_user_abort() 文档结合使用,即使用户取消下载,仍然可以执行unlink

 ignore_user_abort(true); ... unlink($f); 

没有任何正确的方法来检测文件是否完全由用户下载。
所以最好的办法是在一段时间不活动后删除文件。

我总是使用以下解决scheme:

 register_shutdown_function('unlink', $file); 

我的网站也有类似的function。 这将像删除/取消下载后删除随机创build的文件夹和zip文件。 我试图在这里解释一下,可能有人觉得它有用。

skin.php:
此页面包含下载链接,如“http://mysite.com/downoload/bluetheme”;

的.htaccess:
我有以下规则在htaccess文件中redirect下载请求到一个PHP文件。 [的download.php]。

 RewriteRule ^download/([A-Za-z0-9]+)$ download.php?file=$1 [L] 

的download.php:

 include "class.snippets.php"; $sn=new snippets(); $theme=$_GET['file']; $file=$sn->create_zip($theme); $path="skins/tmp/$file/$file.zip"; $config_file="skins/tmp/$file/xconfig.php"; $dir="skins/tmp/$file"; $file.=".zip"; header("Content-type: application/zip"); header("Content-Disposition: attachment; filename=$file"); header("Pragma: no-cache"); header("Expires: 0"); readfile($path); //remove file after download unlink($path); unlink($config_file); rmdir($dir); 

所以请求download.php将使用snippets类创build一个随机名称的目录。 在目录内,它将创build一个zip文件。 下载/取消请求后,所有文件和目录将被删除。

我找不到为我工作的东西,所以我想出了这个,这对我来说似乎很好:

 header('Content-type: application/zip'); //this could be a different header header('Content-Disposition: attachment; filename="'.$zipName.'"'); ignore_user_abort(true); $context = stream_context_create(); $file = fopen($zipName, 'rb', FALSE, $context); while(!feof($file)) { echo stream_get_contents($file, 2014); } fclose($file); flush(); if (file_exists($zipName)) { unlink( $zipName ); } 

我希望能帮助别人

我能想到的最安全的方法是使用一些客户端的Flash电影,可以观察客户端的传输,然后一旦下载完成,就向服务器发出一个XmlHttpRequest调用。

AFAIK,没有使用Flash(或类似的浏览器插件)没有办法可靠地做到这一点,

connection_aborted()从来没有为我工作。 但ob_clean()完全按照它应该的方式工作。 希望这也能帮助别人

 header('Content-type: application/pdf'); header('Content-Disposition: inline; filename="' . $file . '"'); header('Content-Transfer-Encoding: binary'); header('Accept-Ranges: bytes'); ob_clean(); flush(); if (readfile($file)) { unlink($file); }