удаление файла после загрузки пользователем

Я использую это для отправки файла пользователю

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

Я хочу удалить этот файл после того, как пользователь загрузит его, как я могу это сделать?

EDIT: Мой сценарий подобен этому, когда пользователь нажимает кнопку загрузки, мой скрипт создаст временный zip-файл, и пользователь загрузит его, затем будет удален временный zip-файл.

EDIT2: OK лучший способ, похоже, запускает задание cron, которое будет очищать временные файлы один раз в час.

EDIT3: я протестировал свой скрипт с unlink , он работает, если пользователь не отменит загрузку. Если пользователь отменит загрузку, zip-файл останется на сервере. Так что этого достаточно. 🙂

EDIT4: WOW! connection_aborted() сделал трюк!

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

Это удалит файл, даже если пользователь отменит загрузку.

 unlink($filename); 

Это приведет к удалению файла.

Он должен быть объединен с ignore_user_abort() Docs, так что unlink все еще выполняется, даже пользователь отменил загрузку.

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

Нет никакого правильного способа определить, был ли файл полностью загружен пользователем или нет.
Таким образом, лучший способ – удалить файл после некоторого периода бездействия.

Я всегда использую следующее решение:

 register_shutdown_function('unlink', $file); 

У меня тоже очень похожая функциональность на одном из моих сайтов. Это будет похоже на удаление случайно созданного файла папки и zip после / отмена загрузки. Я пытаюсь объяснить это здесь, может быть, кто-то сочтет это полезным.

skin.php:
Эта страница содержит ссылку для скачивания, такую ​​как «http://mysite.com/downoload/bluetheme»

.htaccess:
У меня есть правило в файле htaccess для перенаправления запроса на загрузку в 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); - 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. Внутри каталога будет создан 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 ); } в 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 ); } 

Я надеюсь, что это поможет кому-то

Самый безопасный способ, о котором я могу думать, – использовать некоторые флеш-ролики на стороне клиента, которые могут наблюдать за передачей с клиентской стороны, а затем сделать запрос 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); }