Класс для работы с 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/>";

Комментариев: 2

  1. i-novice.net:

    Хм. Интересно. Я раньше только Pclzip использовал.

  2. E-Not:

    Полезный материал,спасиб.Закину себе в закладки страничку.

Оставьте свой отзыв