用户下载后删除文件
我正在使用这个发送文件给用户
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); }