Подтвердить что ты не робот

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

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

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);
}

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

4b9b3361

Ответ 1

unlink($filename);

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

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

ignore_user_abort(true);

...

unlink($f);

Ответ 2

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

register_shutdown_function('unlink', $file);

Ответ 3

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

Ответ 4

У меня тоже очень похожая функциональность на одном из моих сайтов. Это будет похоже на удаление случайно созданной папки и 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 файл. после загрузки/отмены запроса все файлы и каталог будут удалены.

Ответ 5

Я не мог найти что-то, что сработало для меня, поэтому я придумал это, что, похоже, хорошо работает для меня:

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 );
}

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

Ответ 6

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);
}

Ответ 7

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

AFAIK, нет способа сделать это надежно, не используя Flash (или аналогичный плагин для браузера)