Работа с ZIP архивами в PHP

Расширение архива Zip в PHP используется для работы с Zip архивами и файлами, которые в них содержатся. Для использования этого расширения в PHP необходимо активировать php_zip.dll внутри файла php.ini. В этой статье вы узнаете о том, как работать с файлами Zip архивов в PHP, используя ряд PHP демо-приложений. Вы научитесь: создавать Zip архивы;

  • создавать Zip архивы;
  • добавлять файлы и папки в архив из строки и данной дорожки;
  • удалять и переименовывать файлы, используя их индексы и имена;
  • составлять список характеристик объектов ZipArchive (количество файлов, имя файла, комментарии, statusSys и т. д.).

Создание Zip архивов в PHP и добавление файлов

Для создания Zip архива в PHP можно использовать предопределенную константу ZIPARCHIVE::CREATE; архив будет создан, если он еще не существует. (Для добавления файлов внутрь архива можно использовать вышеописанные методы addFile и addFromString.) Первое демо-приложение (add_file_from_string.php) создает (если таковой еще не существует) или открывает Zip архив archive1.zip, а после добавляет в него файл, используя метод addFromString():

bool ZipArchive::addFromString ( string $localname , string $contents ): Добавить файл в Zip-архив, используя его содержание.

Здесь код для add_file_from_string.php:

С результаты выполнения add_file_from_string.php вы также можете ознакомиться на Рисунке 1.

Файловый текст test1.txt был успешно добавлен в archive1.zip

Рис.1 The archive1.zip

Второе демо-приложение (add_file_directory.php) также использует архив archive1.zip для печати всех характеристик объекта ZipArchive (статус, statusSys, numFiles, название файла, комментарии или специальные параметры, в нашем случае архивный комментарий и количество файлов), чтобы добавить пустой каталог под названием Subdirectory1. Это приложение также использует архив archive1.zip для добавления нового файла, используя метод addFile. Ниже содержатся прототипы методов addFile() и addEmptyDir():

bool ZipArchive::addFile ( string $filename [, string $localname ] ) : добавляет файл в Zip-архив с даного пути bool ZipArchive::addEmptyDir ( string $dirname ) : добавляет пустую папку в архив.

Здесь код для add_file_directory.php:

<?php
 
$zip = new ZipArchive();
$zip->open('archive1.zip');

// Подробный список всех ZipArchive объектов
print_r($zip);

// Добавление пустого каталога
if ($zip->addEmptyDir('Subdirectory1')) {
    echo 'Создан новый каталог';
} else {
    echo 'Не могу создать директорию';
}

// Добавление нового текстового файла test2.txt
$zip->addFile('test2.txt');

// Список комментариев архива archive1.php
echo "Комментарий: " . $zip->comment;

// Список номеров фалов архива archive1.php
echo "№ файла:" . $zip->numFiles;

С результатом листинга add_file_directory.php вы также можете ознакомиться на Рисунке 2:

ZipArchive Object ( [status] => 0 [statusSys] => 0 [numFiles] => 2 [filename] => D:\Apache Group\Apache2\htdocs\php\ZIP\archive1.zip [comment] => PHP ZIP ARCHIVE ) Создан новый каталог Комментарий: PHP ZIP ARCHIVE № файла:4

Рисунок 2. Характеристики объекта archive2.zip

Следующее демо-приложение служит для создания Zip архива archive2.zip, который включает два файла: test3.txt и test4.txt. (Информацию о том, как пользоваться этим приложением, вы сможете найти ниже.) Код для archive2.php:

Результат archive2.php. Вы также можете ознакомиться с результатами на Рисунке 3: Файловый текст test3.txt успешно добавлен в archive2.zip при использовании метода addFile Файловый текст test4.txt успешно добавлен в archive2.zip при использовании метода addFromString method.

Рисунок 3. Содержание archive2.zip

Извлечение Zip архива в PHP

Демо-приложение этой части (extract_archives.php) показывает, как извлекать содержимое архива в специальную папку, используя метод extractTo():bool ZipArchive::extractTo ( string $destination [, mixed $entries ] ) : извлечь содержимое архива.

Архивы archive1.zip и archive2.zip будут извлечены в папку archive, как показано на Рисунке 4. Код для extract_archives.php:

<?php
     
$zip1 = new ZipArchive;
$zip2 = new ZipArchive;

//Открываем Zip-архив
$extract1 = $zip1->open('archive1.zip');
$extract2 = $zip2->open('archive2.zip');

if (($extract1 === TRUE) && ($extract2 === TRUE)) {
    //Извлекаем содержимое архива
    $zip1->extractTo('archive');
    $zip2->extractTo('archive');

    //Закрываем Zip-архив
    $zip1->close();
    $zip2->close();
    echo 'Архивы archive1.zip и archive2.zip были извлеченны в папку!';
} else {
    echo 'Извлечение archive1.zip и archive2.zip не удалось!';
}

Результат extract_archives.php: archive1.zip и archive2.zip были извлечены в папку archive!

Рисунок 4. Содержимое папки archive после извлечения archive1 и archive2

Следующее демо-приложение (extract_to_specified_folder.php) извлекает содержимое Zip архива в специальную папку, используя вышеописанный метод extractTo(). Код для extract_to_specified_folder.php:

<?php
     
//Создаём объект
$zip = new ZipArchive();

// открываем архив
if ($zip->open('archive1.zip') !== TRUE) {
    die ("Не могу окрыть архив");
}

// извлекаем содержимое в папку назначения
$zip->extractTo('../ZIP_extract/');

//Закрываем архив
$zip->close();
echo "Архив извлечен в папку ZIP_extract!";

Результат extract_to_specified_folder.php. Вы также можете ознакомиться с результатами на Рисунке 5: Архив извлечен в папку ZIP_extract!

Рисунок 5. Папка ZIP_extract с файлами archive1

<?php

// Создаём объект
$zip = new ZipArchive();

// Открываем архив
if ($zip->open('archive2.zip') !== TRUE) {
    die ("Не могу октыть архив");
}

// Извлекаем выбраные файлы в назначеную директорию ZIP_TEST
$fileList = array('test3.txt','test4.txt');
$zip->extractTo('../ZIP_TEST/', $fileList);

// Закрываем архив
$zip->close();
echo "Файлы test3.txt и test4.txt извлечены успешно из рахива archive2.zip в указанный каталог!";

С результатами листинга filelist.php вы также можете ознакомиться с на Рисунке 6: Файлы test3.txt и test4.txt из архива archive2.zip успешно извлечены в указанный каталог ZIP_TEST!

Рисунок 6.Выбранные файлы, извлеченные из archive2 в назначеный каталог ZIP_TEST

Получение характеристик объекта на основе его индекса

Для получения характеристик отдельного файла можно использовать метод statIndex:

mixed ZipArchive::statIndex ( int $index [, int $flags ] ).

Следующее демо-приложение (statIndex.php) итерирует список файлов в archive2.zip и печатает характеристики для каждого из объектов. Код для statIndex.php:

<?php
     
// Создаём объект
$zip = new ZipArchive();

// Окрываем архив archive2.zip
if ($zip->open('archive2.zip') !== TRUE) {
    die ("Не могу открыть архив");
}

// Получаем номер файла в архиве archive2.zip
$numFiles = $zip->numFiles;

// Переборираем списк файлов
for ($i = 0; $i < $numFiles; $i++) {
    // Получаем подробную информацию записи определеную её индексом
    print_r($zip->statIndex($i));
}

// закрываем архив
$zip->close();

Результат листинга 5.php:

Array ( 
[name] => test3.txt
[index] => 0 [crc] => -1117485446
[size] => 45 <br>
[mtime] => 1269720238 <br>
[comp_size] => 46 [comp_method] => 8 
)
Array (
[name] => test4.txt 
[index] => 1 [crc] => -1780851877 
[size] => 77 
[mtime] => 1269786772 
[comp_size] => 62 
[comp_method] => 8 )

Следующее демо-приложение (locate.php) также позволяет получать характеристики файла, при условии что archive1.zip содержит этот файл. Метод locateName возвращает индекс файла в архиве и использует предопределенную константу ZIPARCHIVE::FL_NODIR, которая игнорирует компонент каталог. Прототип константы ZIPARCHIVE::FL_NODIR :

mixed ZipArchive::locateName ( string $name [, int $flags ] )

Код для locate.php:

<?php

//Создаём объект
$zip = new ZipArchive();

//Открываем архив
if ($zip->open('archive1.zip') === TRUE) {

    //Находим указаный файл в архиве и выводим его подробную информацию
    $locate_file = $zip->locateName('test2.txt', ZIPARCHIVE::FL_NODIR);
    if ($locate_file === TRUE) {
        $file = $zip->statIndex($locate_file);
        print_r($file);
    }

    // закрываем архив
    $zip->close();
} 

Результат листинга locate.php:

Array ( [name] => test2.txt [index] => 2 [crc] => -513033757 [size] => 50 [mtime] => 1269715222 [comp_size] => 49 [comp_method] => 8 )

Удаление и переименование Zip архивов в PHP

Для удаления или переименования Zip архивов в PHP можно использовать имя или индекс. Методы, которыми можно воспользоваться для этой цели, включают:bool ZipArchive::deleteIndex ( int $index ) – Удаляет объект в архиве, используя индекс; bool ZipArchive::deleteName ( string $name ) – Удаляет объект в архиве, используя имя; bool ZipArchive::renameIndex ( int $index , string $newname ) – Переименует объект на основе индекса; bool ZipArchive::renameName ( string $name , string $newname ) – Переименует объект на основе имени.

Следующее демо-приложение (rename.php) использует все вышеперечисленные методы для переименования файла с «index=3», как «renameByIndex.txt», и «test4.txt», как «renameByName.txt». Код для rename.php:

<?php

// создаём объект
$zip = new ZipArchive();

// открываем архив
if ($zip->open('archive2.zip') !== TRUE) {
    die ("Не могу открыть архив");
}

// переменовываем файл в архиве по его индексу
$zip->renameIndex(0, 'renamedByIndex.txt') or die("ERROR: не могу переменовать файл");

// переменовываем файл в архиве по его имени
$zip->renameName("test3.txt", "renamedByName.txt") or die("ERROR: не могу переменовать файл");

// закрываем и сохраняем архив
$zip->close();
echo "Файл усепшно переменован в архиве archive2.zip!";

Результаты листинга rename.php. Вы также можете ознакомиться с результатами на Рисунке 7 и Рисунке 8: Файлы успешно переименованы в архиве archive2.zip!

Рисунок 7. Исходное содержимое archive2.zip

Рисунок 8. Содержание архива archive2.zip после того, как файлы были переименованы

Следующее приложение (delete.php) удаляет из archive2.zip файл с «index=1» и текстовый файл renameByIndex.txt, используя методы deleteIndex() и deleteName(). Код для delete.php:

 <?PHP
 
// создаём объект
$zip = new ZipArchive();
 
// открываем архив
if ($zip->open('archive2.zip') !== TRUE) {
    die ("Could not open archive");
}
 
// Удаляем файл с индексом=1 из архива archive2.zip
$zip->deleteIndex(0) or die("ERROR: Не могу удалить файл с индексом=1 ");
 
// Удалаяем файл test3.txt из архива archive2.zip
$zip->deleteName('renameByIndex.txt') or die("ERROR: Не могу удалить файл test3.txt");
 
echo "Файл был удалён из архива archive2.zip!";
 
// закрываем и сохраняем архив
$zip->close();

В связи с тем, что архив содержал всего два файла и оба были удалены, archive2.zip был также удален. Следующее приложение (add_text_files.php) итерирует архивные файлы и добавляет все файлы .txt из настоящего каталога в text_archive.zip. Код для add_text_files.php:

 <?php
 
// Создаём объект
$zip = new ZipArchive();
 
// Открываем архив
if ($zip->open('text_archive.zip', ZIPARCHIVE::CREATE) !== TRUE) {
    die ("Could not open archive");
}
 
// Добавленпие всех файлов с расширением .txt из текущего каталога в архив text_archive.zip
foreach (glob ('*.txt') as $textfile) {
    $zip->addFile($textfile);
}
 
// Закрываем архив
$zip->close();
 
echo "Архив text_archive.zip был спешно создан!";

Результаты листинга add_text_files.php: text_archive.zip успешно создан!

Рисунок 9. Группировка всех текстовых файлов из текущего каталога в новый архив text_archive.zip

Заключение

Как вы, наверное, заметили, изучая приложения, представленные в статье, работать с расширением архива Zip в PHP довольно просто и даже забавно. Все, что от вас требуется, это умение обращаться с методами расширения. В этом случае вы с успехом сможете осуществлять различные операции с Zip архивами.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *