Версия для печати

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

Расширение архива Zip в PHP используется для работы с Zip архивами и файлами, которые в них содержатся. Для использования этого расширения в PHP 5 необходимо активировать 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

Рис.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:

  1.  
  2. <?php
  3.  
  4. $zip = new ZipArchive();
  5.  
  6. $zip->open('archive1.zip');
  7.  
  8. // Подробный список всех ZipArchive объектов
  9. print_r($zip);
  10.  
  11. //Добавление пустого каталога
  12. if($zip->addEmptyDir('Subdirectory1')) {
  13. echo 'Создан новый каталог'. "
  14. ";
  15. } else {
  16. echo 'Не могу создать директорию'. "
  17. ";
  18. }
  19.  
  20. //Добавление нового текстового файла test2.txt
  21. $zip->addFile('test2.txt');
  22.  
  23. //Список комментариев архива archive1.php
  24. echo "Комментарий: " . $zip->comment . "
  25. ";
  26.  
  27. //Список номеров фалов архива archive1.php
  28. echo "№ файла:" . $zip->numFiles . "
  29. ";
  30.  
  31. ?>

С результатом листинга 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

Характеристики объекта archive2.zip

Рисунок 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.

Содержание archive2.zip

Рисунок 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:

  1. <?php
  2.  
  3. $zip1 = new ZipArchive;
  4. $zip2 = new ZipArchive;
  5.  
  6. //Открываем Zip-архив
  7. $extract1 = $zip1->open('archive1.zip');
  8. $extract2 = $zip2->open('archive2.zip');
  9.  
  10. if (($extract1 === TRUE) && ($extract2 === TRUE)) {
  11.  
  12. //Извлекаем содержимое архива
  13. $zip1->extractTo('archive');
  14. $zip2->extractTo('archive');
  15.  
  16. //Закрываем Zip-архив
  17. $zip1->close();
  18. $zip2->close();
  19. echo 'Архивы archive1.zip и archive2.zip были извлеченны в папку!';
  20.  
  21. } else {
  22. echo 'Извлечение archive1.zip и archive2.zip не удалось!';
  23. }
  24.  
  25. ?>

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

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

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

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

  1. <?php
  2.  
  3. //Создаём объект
  4. $zip = new ZipArchive();
  5.  
  6. // открываем архив
  7. if ($zip->open('archive1.zip') !== TRUE) {
  8. die ("Не могу окрыть архив");
  9. }
  10.  
  11. // извлекаем содержимое в папку назначения
  12. $zip->extractTo('../ZIP_extract/');
  13.  
  14. //Закрываем архив
  15. $zip->close();
  16. echo "Архив извлечен в папку ZIP_extract!";
  17.  
  18. ?>

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

Папка ZIP_extract с файлами archive1

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



  1. <?php
  2.  
  3. //Создаём объект
  4. $zip = new ZipArchive();
  5.  
  6. //Открываем архив
  7. if ($zip->open('archive2.zip') !== TRUE) {
  8. die ("Не могу октыть архив");
  9. }
  10.  
  11. //Извлекаем выбраные файлы в назначеную директорию ZIP_TEST
  12. $fileList = array('test3.txt','test4.txt');
  13. $zip->extractTo('../ZIP_TEST/', $fileList);
  14.  
  15. //Закрываем архив
  16. $zip->close();
  17. echo "Файлы test3.txt и test4.txt извлечены успешно из рахива archive2.zip в указанный каталог!";
  18. ?>

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

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

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

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

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

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

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

  1. <?php
  2.  
  3. //Создаём объект
  4. $zip = new ZipArchive();
  5.  
  6. //Окрываем архив archive2.zip
  7. if ($zip->open('archive2.zip') !== TRUE) {
  8. die ("Не могу открыть архив");
  9. }
  10.  
  11. //Получаем номер файла в архиве archive2.zip
  12. $numFiles = $zip->numFiles;
  13.  
  14. //Переборираем списк файлов
  15. for ($i=0; $i<$numFiles; $i++) {
  16.  
  17. //Получаем подробную информацию записи определеную её индексом
  18. print_r($zip->statIndex($i));
  19. print "
  20. ";
  21. }
  22.  
  23. //закрываем архив
  24. $zip->close();
  25.  
  26. ?>
Результат листинга 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:

  1. <?php
  2. //Создаём объект
  3. $zip = new ZipArchive();
  4.  
  5. //Открываем архив
  6. if ($zip->open('archive1.zip') === TRUE) {
  7.  
  8. //Находим указаный файл в архиве и выводим его подробную информацию
  9. $locate_file = $zip->locateName('test2.txt', ZIPARCHIVE::FL_NODIR);
  10. if ($locate_file == TRUE) {
  11. $file = $zip->statIndex($locate_file);
  12. print_r($file);
  13. }
  14.  
  15. // закрываем архив
  16. $zip->close();
  17. }
Результат листинга 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:

  1. <?PHP
  2.  
  3. // создаём объект
  4. $zip = new ZipArchive();
  5.  
  6. // открываем архив
  7. if ($zip->open('archive2.zip') !== TRUE) {
  8. die ("Не могу открыть архив");
  9. }
  10.  
  11. // переменовываем файл в архиве по его индексу
  12. $zip->renameIndex(0, 'renamedByIndex.txt') or die("ERROR: не могу переменовать файл");
  13.  
  14. // переменовываем файл в архиве по его имени
  15. $zip->renameName("test3.txt", "renamedByName.txt") or die("ERROR: не могу переменовать файл");
  16.  
  17. // закрываем и сохраняем архив
  18. $zip->close();
  19. echo "Файл усепшно переменован в архиве archive2.zip!";
  20. ?>

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

Исходное содержимое archive2.zip

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

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

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

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

  1.  
  2. <?PHP
  3.  
  4. // создаём объект
  5. $zip = new ZipArchive();
  6.  
  7. // открываем архив
  8. if ($zip->open('archive2.zip') !== TRUE) {
  9. die ("Could not open archive");
  10. }
  11.  
  12. //Удаляем файл с индексом=1 из архива archive2.zip
  13. $zip->deleteIndex(0) or die("ERROR: Не могу удалить файл с индексом=1 ");
  14.  
  15. //Удалаяем файл test3.txt из архива archive2.zip
  16. $zip->deleteName('renameByIndex.txt') or die("ERROR: Не могу удалить файл test3.txt");
  17.  
  18. echo "Файл был удалён из архива archive2.zip!";
  19.  
  20. // закрываем и сохраняем архив
  21. $zip->close();
  22. ?>
  23.  

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

  1.  
  2. <?php
  3.  
  4. //Создаём объект
  5. $zip = new ZipArchive();
  6.  
  7. //Открываем архив
  8. if ($zip->open('text_archive.zip', ZIPARCHIVE::CREATE) !== TRUE) {
  9. die ("Could not open archive");
  10. }
  11.  
  12. //Добавленпие всех файлов с расширением .txt из текущего каталога в архив text_archive.zip
  13. foreach (glob ('*.txt') as $textfile) {
  14. $zip->addFile($textfile);
  15. }
  16.  
  17. //Закрываем архив
  18. $zip->close();
  19.  
  20. echo "Архив text_archive.zip был спешно создан!";
  21.  
  22. ?>
  23.  

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

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

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

Заключение

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

Понравилась статья?

Прочитано 17611 раз