Ответ 1
unlink($filename);
Это приведет к удалению файла.
Он должен быть объединен с ignore_user_abort()
Docs, так что unlink
все еще выполняется даже пользователь отменил загрузку.
ignore_user_abort(true);
...
unlink($f);
Я использую это для отправки файла пользователю
header('Content-type: application/zip');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="file.zip"');
readfile($file);
Я хочу удалить этот файл после загрузки пользователем, как я могу это сделать?
EDIT: мой сценарий похож на этот, когда пользователь нажимает кнопку загрузки, мой script создаст временный zip файл и пользователь загрузит его, после чего будет удален временный zip файл.
EDIT2: OK лучший способ, похоже, запускает задание cron, которое будет очищать временные файлы один раз в час.
EDIT3: я тестировал свой script с помощью 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);
поэтому по запросу 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 );
}
Я надеюсь, что это поможет кому-то
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);
}
Самый безопасный способ, которым я могу думать, - использовать какой-то флеш-фильм на стороне клиента, который может наблюдать передачу с клиентской стороны, а затем сделать вызов XmlHttpRequest на сервер после завершения загрузки.
AFAIK, нет способа сделать это надежно, не используя Flash (или аналогичный плагин для браузера)