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.07.2019, обновлено 31.08.2019
19253
Предыдущая запись Чтение Google таблиц в PHP
Следующая запись Автозагрузка классов

Комментарии 1

Вадим R Вадим R
9 января 2023 в 17:38
Если файл на стороннем ресурсе добавляем его так
$zip->addFromString($newFileName, file_get_contents($filePath));

, чтобы добавить комментарий.

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

Использование API Яндекс Диска на PHP
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
55409
+20
Пример парсинга html-страницы на phpQuery
phpQuery – это удобный HTML парсер взявший за основу селекторы, фильтры и методы jQuery, которые позволяют...
61749
+25
Загрузка файлов на сервер PHP
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
71549
+22
Поиск файлов в PHP
Для поиска файлов на сервере хорошо подходит функция glob(), которая возвращает список файлов по заданной маске, например...
23387
+1
Как сформировать большой файл для маркета
На сайте интернет-магазина с большим количеством товаров (от 8000) возникает проблема с формированием XML-фида для...
3732
+3
Генерация счета на оплату PDF PHP
С помощью расширения dompdf можно легко сформировать PDF файл. По сути, dompdf - это конвертер HTML в PDF который...
64786
+33