Я использую это для отправки файла пользователю
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); }