Все ленты — последние статьи

Класс для работы с zip-архивами

В PHP 5.2.0 был добавлен встроенный класс для работы с zip архивами на запись и чтение. Сегодня мы рассмотрим несколько примеров его использования. Прежде всего, убедитесь, что включена поддержка библиотеки php_zip.dll. Для этого в файле php.ini нужно убрать символ комментария (;) в начале строки
extension=php_zip.dll

и перезапустить Apache.

Теперь переходим к созданию архива. Все операции с архивом выполняются с помощью объекта ZipArchive. После создания экземпляра класса создаем файл архива с помощью метода open(), который в качестве параметров принимает имя архива и константу, указывающую способ открытия.

Чтобы добавить в архив файл, используем метод addFile(), который принимает два параметра: имя исходного файла и имя, под которым файл будет добавлен в архив. Завершает работу с архивом метод close().


<?php
// Создаем архив
$zip = new ZipArchive;
$res = $zip -> open("archive.zip", ZIPARCHIVE::CREATE);
if ( $res === true ) {
$zip -> addFromString("string.txt", "Это строка, которая будет записана в файл string.txt, а сам файл помещен в архив");
// Файл file.txt будет помещен в архив под именем file_zip.txt
$zip -> addFile("file.txt", "file_zip.txt");
$zip -> close();
echo "<p>Файлы добавлены в архив</p>";
} else {
echo "<p>Ошибка</p>";
}
?>

Напишем небольшой скрипт, который будет создавать архив со всеми файлами из какой-нибудь папки.
<?php
// Создаем архив и добавляем в него все файлы из директории
$zip = new ZipArchive;
$res = $zip -> open("images.zip", ZIPARCHIVE::CREATE);
if ($res === true) {
$dir = opendir( "./images" );
chdir( "./images" );

while( $d = readdir( $dir ) ) {
if( is_file( $d ) ) {
echo "Добавляем в архив файл ".$d." размером ".filesize( $d )."<br />";
$zip -> addFile( $d, $d);
}
}
closedir( $dir );
$zip -> close();
echo "<p>Файлы добавлены в архив</p>";
} else {
echo "<p>Ошибка</p>";
}
?>

Извлечение файла из архива выполняется в три этапа:

открываем архив с помощью метода open()
извлекаем файлы (метод extractTo())
закрываем архив методом close().

<?php
// Извлекаем файлы из архива
$zip = new ZipArchive;
if ( $zip -> open("archive.zip") === true ) {
$zip -> extractTo("testunzip");
$zip -> close();
echo "<p>Архив распакован</p>";
} else {
echo "<p>Ошибка при извлечении файлов из архива</p>";
}
?>

Обратите внимание, что здесь используется тот же метод open(), что и при создании архива, но константа ZIPARCHIVE::CREATE не указывается. Мы собираемся что-то извлечь из архива, значит, он должен существовать.

Метод extractTo() принимает два параметра: имя папки, в которую будет извлечено содержимое архива и имена объектов, которые необходимо извлечь. В нашем примере второй параметр не задан. Это означает, что будет распаковано все содержимое архива.

С помощью методов объекта ZipArchive можно не только добавлять и извлекать файлы, но и получить информацию об архиве:
// читаем сведения об архиве
echo "Number of files: ".$zip->numFiles."<br/>";
echo "status: ".$zip->status."<br/>";
echo "statusSys: ".$zip->statusSys."<br/>";
echo "filename: ".$zip->filename."<br/>";
echo "comment: ".$zip->comment."<br/>";