Как распаковать zip-архив с заменой файлов с помощью PHP?

Всем доброго времени суток. Думаю, по заголовку все понятно, но повторюсь. Подскажите, каким образом можно распаковать zip-архив обязательно с заменой файлов, используя PHP?

Неважно какой библиотекой, главное, чтобы работало.
Заранее благодарю за ответ.
  • Вопрос задан
  • 5126 просмотров
Решения вопроса 1
@Metalbrother
Приблизительно так (с использованием PclZip):
require_once 'pclzip.lib.php';
$archive = new PclZip('archive.zip');

$archive->extract(PCLZIP_OPT_PATH, 'folder', PCLZIP_CB_PRE_EXTRACT, 'preExtractCallback');

// функция будет вызвана перед распаковкой очередного файла
function preExtractCallback($p_event, &$p_header)
{
    // если файл уже существует, то удаляем его
    if (file_exists($p_header['filename'])) {
        unlink($p_header['filename']);
    }
    return 1;
}


www.phpconcept.net/pclzip/user-guide/48
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
nazarpc
@nazarpc
Open Source enthusiast
Используйте Phar, он может иметь структуру Phar, Tar и Zip форматов.
Посмотрите мой пример использования:
https://github.com/nazar-pc/CleverStyle-CMS/blob/m...
Сначала создаю обычный Phar, потом конвертирую в *.tar.bz2
Документация:
www.php.net/manual/ru/book.phar.php
Не нужно использовать сторонних библиотек, если всё есть из коробки.
Ответ написан
@NewMax
Когда-то давно делал так (с проверкой существования нужных файлов в архиве):
//передается путь к zip архиву
public function getData($filename)  {
$zip = new \ZipArchive;
$res = $zip->open($filename);
if ($res === true) {
  $msg = '';
  $fail = false;
  if (!$zip->getFromName('1.txt')) {
     $fail = true;
     $msg .= 'В архиве не найден файл 1.txt. ';
   }
   if (!$zip->getFromName('2.txt')) {
         $fail = true;
         $msg .= 'В архиве не найден файл 2.txt. ';
    }
    if (!$zip->getFromName('3.txt')) {
          $fail = true;
          $msg .= 'В архиве не найден файл 3.txt. ';
    }
    if (!$zip->getFromName('4.txt'))
    {
                $fail = true;
                $msg .= 'В архиве не найден файл 4.txt. ';
    }
    if ($fail) {
         return $ms;
    }
    $zip->extractTo(__DIR__.'/../../../../web/uploads/DBfiles/res');
    $zip->close();
    return 'Файлы успешно распакованы';
   }
   return 'Не удалось открыть архив';
}

И старые файлы успешно заменяются.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы