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 252
Следующая запись Автозагрузка классов

Поделится

Темы

Files PHP

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

Перетаскивание элементов списков, плитки и строк таблиц с помощью плагина jQuery UI Sortable и методы сохранения...
Данный вопрос возникает при верстке писем т.к. стили прописанные в head в почтовых сервисах и программах не работают, а...
Можно найти множество применений Яндекс Диска на своем сайте, например, хранение бекапов и отчетов, обновление прайсов,...
В статье представлены различные PHP расширения для чтения файлов XLS, XLSX. Описаны их плюсы и минусы, а также примеры...
В статье представлены все самые встречающеюся мета-теги с примерами и пояснениями их использования.
Для удобства код классов выносят в отдельные php файлы и подключают их по мере надобности.