PHP

ZIP в PHP (ZipArchive)

Класс ZipArchive позволяет быстро и удобно работать с ZIP-архивам, рассмотрим основные возможности класса.

1

Добавление файлов в архив

В примере используются константы:

  • ZipArchive::CREATE – создавать архив, если он не существует
  • ZipArchive::OVERWRITE – если архив существует, то игнорировать текущее его содержимое т.е. работать как с пустым архивом.
$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
$zip->addFile(__DIR__ . '/image1.jpg', 'image1.jpg');
$zip->addFile(__DIR__ . '/image2.jpg', 'image2.jpg');
$zip->close();
PHP

Если файл необходимо поместить в директорию, то предварительно не нужно создавать пустую папку. Можно просто указать путь и имя файла, например «src»: 

$zip->addFile(__DIR__ . '/image1.jpg', 'src/image1.jpg');
$zip->addFile(__DIR__ . '/image2.jpg', 'src/image2.jpg');
PHP

Если текстовой файл генерится прямо в скрипте, то удобней скинуть его в архив методом addFromString().

$contents = 'Содержание файла file.log';

$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
$zip->addFromString('file.log', $contents);
$zip->close();
PHP
2

Заархивировать директорию с содержимым

Сделать архив сайта можно с помощью рекурсивной функции, функция обойдет все файлы в директориях и добавит их в архив.

function addFileRecursion($zip, $dir, $start = '')
{
    if (empty($start)) {
        $start = $dir;
    }
    
    if ($objs = glob($dir . '/*')) {
        foreach($objs as $obj) { 
            if (is_dir($obj)) {
                addFileRecursion($zip, $obj, $start);
            } else {
                $zip->addFile($obj, str_replace(dirname($start) . '/', '', $obj));
            }
        }
    }
}

$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip', ZipArchive::CREATE|ZipArchive::OVERWRITE);
addFileRecursion($zip, __DIR__ . '/test');
$zip->close();
PHP
3

Переименовать файл

$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$zip->renameName('image2.jpg', 'images.jpg');
$zip->close();
PHP

Если файл лежит в папке:

$zip->renameName('src/image2.jpg', 'src/images.jpg');
PHP
4

Удалить файл из архива

$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$zip->deleteName('image2.jpg');
$zip->close();
PHP

Если файл лежит в папке:

$zip->deleteName('src/image2.jpg');
PHP
5

Список файлов в архиве

$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');

$i = 0;
$list = array();
while($name = $zip->getNameIndex($i)) {
    $list[$i] = $name;
    $i++;
}

print_r($list);

$zip->close();
PHP
Array
(
    [0] => src/image1.jpg
    [1] => src/image2.jpg
    [2] => file.log
)
6

Извлечь весь архив

$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$zip->extractTo(__DIR__);
$zip->close();
PHP
7

Извлечь определенные файлы

$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');
$zip->extractTo(__DIR__, array('src/image1.jpg', 'src/image2.jpg'));
$zip->close();
PHP
8

Извлечь файл в поток

Данный метод удобен если требуется только прочитать содержимое файла.

$zip = new ZipArchive();
$zip->open(__DIR__ . '/archive.zip');

$contents = '';
$fp = $zip->getStream('file.log');
while (!feof($fp)) {
    $contents .= fread($fp, 2);
}
fclose($fp);
echo $contents;

$zip->close();
PHP
09 июля 2019

Темы

Files PHP

Другие публикации

Сборник регулярных выражений с примерами на PHP для проверки данных из полей форм.
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
Задача: появилась необходимость сделать якорное меню у ранее опубликованных статей, статей много, вручную дополнять их...
Если нужно запретить выполнение скриптов php в директории, например в uploads, нужно поместить туда файл .htaccess со...