PHP Создание ZIP архивов на лету PHP


PHP Создать Zip на лету с паролем

Попробуйте сделать Zip файл с паролем на лету

Теперь все работает нормально (загрузите файл с другого сервера в память, заархивируйте его и отправьте пользователю).

Как установить пароль на zip? (exec () shell_exec () не может использовать) И где в коде это должно быть?

Решение

Теперь это будущее, и теперь вы можете это сделать: (функция PHP7.x)

ZipArchive :: setEncryptionName — устанавливает метод шифрования записи, определяемой ее именем
http://php.net/manual/de/ziparchive.setencryptionname.php

Другие решения

Если вы используете PHP 5.6, вы можете использовать ZipArchive :: SetPassword добавить пароль в текущий активный архив.

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

Уже долгие годы самым распространенным форматом сжатия данных, является формат ZIP. Данный формат широко используется в разработках под web. Поэтому многие языки для web-программирования имеют либо встроенные средства или возможности подключения необходимых библиотек для работы с zip-архивами.

Непосредственно в самом PHP функций для распаковки и создания zip-архивов нету. Хотя это зависит, от вариантов его сборки. Но они присутствуют в PHP расширении “php_zip”. И именно оно позволяет работать с архивными zip-файлами.

Распаковка архива

С распаковкой архивов при веб разработке, приходиться сталкиваться наиболее часто, нежели при разработке прикладного ПО. Особенно когда возникает необходимость в пакетной загрузке данных (документы, сертификаты и т.д.). Ведь даже диалоговое окно для открытия файла в браузере, не имеет возможности мульти выбора файлов. Конечно, можно воспользоваться каким-либо flash-загрузчиком, но во многих ситуациях это не подходит. А значит остается всего один вариант – архивация данных. Для работы по распаковке архива есть ряд функций встроенных в расширение php_zip:

Закрывает архивный zip-файл. Параметр zip обязан быть zip-архивом, открытым до этого функцией zip_open().

Закрывает вхождение директории, специфицированное параметром zip_entry . Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_entry_open().

int zip_entry_filesize (resource $zip_entry )

Возвращает фактический размер вхождения директории zip_entry. Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_read().

string zip_entry_name (resource $zip_entry )

Возвращает имя вхождения директории zip_entry. Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_read().

bool zip_entry_open (resource $zip , resource $zip_entry [, string $mode ])

Открывает вхождение директории в zip-файле для чтения. Параметр zip это правильный дескриптор ресурса, возвращённый функцией zip_open(). Параметр zip_entry это ресурс вхождения директории, возвращённый функцией zip_read(). Необязательный параметр mode может быть одним из режимов, специфицированных в документации для fopen().

Примечание: в настоящее время mode игнорируется и всегда имеет значение “rb”.Это из-за тог, что zip поддерживается в PHP с доступом только для чтения. Возвращает true при успехе, false при неудаче. В отличие от fopen() и других подобных функций, возвращаемое значение функции zip_entry_open() указывает только на результат операции и не нужно для чтения или закрытия вхождения директории.

string zip_entry_read (resource $zip_entry [, int $length ])

Читает до length байтов из открытого вхождения директории. Если параметр length не специфицирован, Функция zip_entry_read() пытается прочитать 1024 байта. Параметр zip_entry является правильным вхождением директории, возвращённым функцией zip_read(). Возвращает прочитанные данные, или false, если достигнут конец файла.

Примечание: параметр length должен быть несжатым размером, который вы хотите прочитать.

resource zip_open (string $filename )

Открывает новый zip-архив для чтения. Параметр filename это имя файла открываемого zip-архива. Возвращает дескриптор ресурса для дальнейшего использования в zip_read() и zip_close(), или возвращает false, если filename не существует.

resource zip_read (resource $zip )

Читает следующее вхождение в файле zip-архива. Параметр zip обязан быть zip-архивом, открытым ранее функцией zip_open(). Возвращает ресурс вхождения директории для дальнейшего использования с zip_entry_… () функциями.

int zip_entry_compressedsize(resource $zip_entry )

Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_read(). Возвращает сжатый размер вхождения директории zip_entry.

string zip_entry_compressionmethod (resource $zip_entry )

Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_read(). Возвращает метод сжатия для вхождения директории zip_entry.

Ниже приведен найденный и модифицированный мной исходный код функции для распаковки архива. Данная функция производит распаковку архива в корневой каталог. Поэтому если есть необходимость в создании директории для последующего расположения в ней распакованных файлов и каталогов, то ее требуется слегка изменить.

Выше был продемонстрирован классический пример распаковки архива. Обратите внимание на то, что указанный к архиву путь, должен быть абсолютным. Но тем не менее существует еще одна возможность, чтобы его распаковать. Для этого нужно прибегнуть к помощи методов класса ZipArchive. Этот класс находится все в том же расширении “php_zip”. Итак для того чтобы применить другой вариант распаковки, необходимо написать следующий код:

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

bool extractTo (string $destination [, mixed $entries ])

Будущая директория местонахождения распакованного архива задается в параметре $destination . Параметр $entries содержит элементы для извлечения. Он является необязательным и может принимать как одно значение, так и массив значений.

Второй вариант выглядит намного красивее и компактнее, чем первый, не так ли? Поэтому я свой выбор остановил именно на нем. И напоследок протестируем оба варианта на скорость распаковки архива объемом в 205Mb:


Создание архива

Создание архива происходит сложнее, чем его распаковка. Если конечно требуется создать архив с одним файлом или одной директорией, то здесь все просто. А вот если упаковывать директории с неограниченным уровнем вложенности каталогов, то здесь уже придется немного подумать. Во-первых, необходим хороший рекурсивный алгоритм для обхода директорий. Во-вторых, нужно дополнительно хранить локальное имя файла/каталога. Итак, для создания архива нам понадобятся четыре метода класса ZipArchive:

    bool addEmptyDir (string $dirname )

Добавляет в архив пустую директорию. Параметр dirname должен содержать имя директории. Метод в случае успеха возвращает true или false в противном случае.

vo >$filename [, string $localname = NULL [, int $start = 0 [, int $length = 0 ]]])

Добавляет в архив файл, который находится по указанному в параметре filename пути. Параметр localname отвечает за имя файла в архиве. И если он указан, то параметр filename будет переопределен. Параметры start и length , зарезервированы для будущих целей. Данный метод так же в случае успеха возвращает true или false в случае ошибки.

vo >$filename [, int $flags ])

Данный метод необходим для открытия нового архива с целью: чтения, записи или создания. Параметр filename должен содержать имя архива. Необязательный параметр flags используется в качестве режима открытия файла (ZIPARCHIVE::OVERWRITE, ZIPARCHIVE::CREATE, ZIPARCHIVE::EXCL, ZIPARCHIVE::CHECKCONS). Метод возвращает true в случае успеха или код ошибки (см. предопределенные константы ошибок).

vo >Этот метод закрывает открытый или созданный архив и сохраняет изменения. Данный метод автоматически вызывается в конце сценария.

Ниже приведен исходный код созданного класса, позволяющего производить создание zip-архивов:

Данный класс позволяет создавать архив из каталогов с неограниченным уровнем вложенности. Для создания архива, необходимо вызвать только один метод ToZip.

    bool ToZip (string $source , string $destination )

Мастер Йода рекомендует:  Категориальное упорядочение результатов запроса

Создает zip-архив. В параметре source требуется указать путь к каталогу или файлу, который требуется запаковать. А в качестве параметра destination передается имя будущего архива. Метод возвращает true в случае успеха или false в случае возникновения ошибки.

Предопределенные константы режима работы

ZIPARCHIVE::CREATE (integer) Создавать архив, если он не существует.
ZIPARCHIVE::OVERWRITE (integer) Всегда создавать новый архив, этот режим перезаписывает файлы, если они существуют.
ZIPARCHIVE::EXCL (integer) Выводить ошибку, если архив существует.
ZIPARCHIVE::CHECKCONS (integer) Выполнять дополнительные проверки на структуру архива, и выдавать ошибку при неудаче.

Предопределенные константы флагов

ZIPARCHIVE::FL_NOCASE (integer) Игнорировать регистр символов в именах элементов архива.
ZIPARCHIVE::FL_NODIR (integer) Не учитывать пути директорий в архиве.
ZIPARCHIVE::FL_COMPRESSED (integer) Читать сжатые данные.
ZIPARCHIVE::FL_UNCHANGED (integer) Использовать исходные данные, игнорируя изменения.

Предопределенные константы методов сжатия

ZIPARCHIVE::CM_DEFAULT (integer) Выбрать лучший метод сжатия deflate или stored (без сжатия).
ZIPARCHIVE::CM_STORE (integer) Метод сжатия stored (без сжатия).
ZIPARCHIVE::CM_SHRINK (integer) Метод сжатия shrunk.
ZIPARCHIVE::CM_REDUCE_1 (integer) Метод сжатия reduced with factor 1.
ZIPARCHIVE::CM_REDUCE_2 (integer) Метод сжатия reduced with factor 2.
ZIPARCHIVE::CM_REDUCE_3 (integer) Метод сжатия reduced with factor 3.
ZIPARCHIVE::CM_REDUCE_4 (integer) Метод сжатия reduced with factor 4.
ZIPARCHIVE::CM_IMPLODE (integer) Метод сжатия imploded.
ZIPARCHIVE::CM_DEFLATE (integer) Метод сжатия deflated.
ZIPARCHIVE::CM_DEFLATE64 (integer) Метод сжатия deflate64.
ZIPARCHIVE::CM_PKWARE_IMPLODE (integer) Метод сжатия PKWARE imploding.
ZIPARCHIVE::CM_BZIP2 (integer) Метод сжатия алгоритмом BZIP2

Предопределенные константы ошибок

Создание ZIP-архива каталога на PHP

ZIP-архивирование на PHP довольно популярная тема. В данной статье покажу пример, как создается ZIP-архив каталога через PHP-скрипт.

Давайте я сразу приведу пример создания ZIP-архива, а затем его тщательно прокомментирую:
В результате выполнения данного скрипта появится ZIP-архив, у которого в корне будет лежать файл ‘index.php‘. Я думаю, что это все очевидно и логично. А теперь комментирую, что мы с Вами делали:
1. Создали объект ZipArchive с помощью конструктора.

2. Создали архив с помощью метода Open объекта ZipArchive. Мы передали название архива archive.zip и константу ZIPARCHIVE::CREATE, которая сообщает, если архив не существует, то его надо создать.

3. Метод AddFile добавляет в архив файл ‘index.php‘, который находится в одной директории со скриптом.

4. Метод Close завершает работу с архивом. Всегда его выполняйте, чтобы освободить ресурсы компьютера, а также избежать проблем, связанных с работой этого скрипта и других скриптов, которым необходим доступ к этому архиву.

Вот таким простым способом можно создавать в автоматическом режиме ZIP-архивы с помощью PHP.

Если вы хотите скачать все содержание каталога, то вам необходимо создать архив файлов с сохранением структуры, а затем скачать его с сервера. Вот код:
Также необходимо написать о разархивирования ZIP-архив через PHP.

Порядок создания архива был прост: открыть, добавить файлы в архив, закрыть. Для извлечения ZIP-архива порядок очень похож: открыть, вытащить, закрыть. Фактически, меняется только центральная часть. Давайте разберем простой пример:
Таким образом, все файлы и папки, которые находятся в ZIP-архиве будут загружены в указанную директорию.

Создание ZIP-архива на PHP

Вчера на форуме у меня спросили про создание ZIP-архивов на PHP. Я немного подумал и понял, что это тема будет интересна большому числу людей, ведь ZIP-архивирование на PHP весьма популярная тема. И в этой статье я покажу пример, как создаётся ZIP-архив через PHP-скрипт.

Давайте я сразу приведу пример создания ZIP-архива, а потом его тщательно прокомментирую:

open(«archive.zip», ZIPARCHIVE::CREATE); //Открываем (создаём) архив archive.zip
$zip->addFile(«index.php»); //Добавляем в архив файл index.php
$zip->addFile(«styles/style.css»); //Добавляем в архив файл styles/style.css
$zip->close(); //Завершаем работу с архивом
?>

В результате выполнения данного скрипта появится ZIP-архив, у которого в корне будет лежать файл index.php, а также будет создана директория styles, в которой будет находиться файл style.css. Я думаю, что это всё очевидно и логично. А теперь комментирую, что мы с Вами делали:

  • Создали объект ZipArchive с помощью конструктора.
  • Создали архив с помощью метода open() объекта ZipArchive. Мы передали название архива (archive.zip) и константу ZIPARCHIVE::CREATE, которая сообщает, если архива не существует, то его надо создать.
  • Метод addFile() добавляет в архив файлы. Сначала мы добавили файл «index.php«, который находится в одной директории со скриптом. Далее мы добавили файл style.css, так же указав к нему правильный путь относительно скрипта.
  • Метод close() завершает работу с архивом. Всегда его выполняйте, чтобы освободить ресурсы компьютера, а также избежать самых различных проблем, связанных с работой этого скрипта и других скриптов, которым необходим доступ к этому архиву.

Вот таким простым способом Вы можете создавать в автоматическом режиме ZIP-архивы с помощью PHP. В следующей статье мы с Вами разберём, как извлекать ZIP-архив через PHP.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:


  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 21 ):

    Напишите статью о том, как создать дерево файлов в каталоге и в подкаталогах.

    Не очень понятно, что означает «как создать дерево файлов»? Это просто вывести на страницу список всех каталогов, подкаталогов, файлов, файлов внутри подкаталогов и так далее. Вы это хотите?

    Да, конечно так. Я пытался так сделать, но у меня работало с ошибками.

    ZIP в PHP (ZipArchive)

    Класс ZipArchive позволяет быстро и удобно работать с ZIP-архивам, рассмотрим основные возможности класса.

    Добавление файлов в архив

    В примере используются константы:

    • ZipArchive::CREATE – создавать архив, если он не существует
    • ZipArchive::OVERWRITE – если архив существует, то игнорировать текущее его содержимое т.е. работать как с пустым архивом.

    Если файл необходимо поместить в директорию, то предварительно не нужно создавать пустую папку. Можно просто указать путь и имя файла, например «src»:

    Если текстовой файл генерится прямо в скрипте, то удобней скинуть его в архив методом addFromString() .

    Заархивировать директорию с содержимым

    Сделать архив сайта можно с помощью рекурсивной функции, функция обойдет все файлы в директориях и добавит их в архив.

    Создайте zip-файл, но предоставляйте его как загрузку без сохранения на сервере [duplicate]

    Я пытаюсь создать архив на лету в PHP и немедленно отправить его пользователю (без сохранения). Я решил, что нет необходимости создавать файл на диске, поскольку данные, которые я отправляю, в любом случае не постоянны, однако при поиске в Интернете я не мог понять, как это сделать. Я также не забочусь о формате файла.

    Возможно ли создание и управление файловым архивом в памяти внутри php-скрипта без создания tempfile по пути?

    5 ответов

    У меня была одна и та же проблема, но в конце концов я нашел несколько неясное решение и решил поделиться им здесь.

    Я пришел по большим сценариям zip.lib.php / unzip.lib.php , которые поставляются с phpmyadmin и являются расположенный в каталоге «libraries».

    Использование zip.lib.php работало как прелесть для меня:

    Этот скрипт позволяет загружать почтовый индекс без необходимости иметь файлы как реальные файлы или сохранение самого zip в качестве файла.

    Позор, что эта функциональность не является частью более общей библиотеки PHP.

    UPDATE: убедитесь, что вы удалили следующую проверку с начала zip.lib.php, иначе скрипт просто завершится:

    Что касается вашего комментария о том, что php: // temp работает для вас, за исключением случаев, когда вы его закрываете, попробуйте оставить его открытым, очистить вывод, а затем перемотать обратно на 0 и прочитать его.

    Есть ли проблема производительности здесь, или это просто оскорбляет ваше чувство правильности? Многие процессы записывают временные файлы и удаляют их, и часто они никогда не попадают на диск из-за кэширования.

    Временной файл автоматически удаляется при закрытии. Вот в чем его природа.

    Есть только два способа создать zip-файл в памяти и обслуживать его, и оба они, вероятно, больше проблем, чем они того стоят.

    • использовать ram диск.
    • изменить класс ziparchive, чтобы добавить метод, который делает все, что делает метод close (), за исключением того, что фактически закрывает файл. (Или добавьте параметр отпускания для закрытия ()). Это может быть даже невозможно в зависимости от базовых библиотек C.

    Примеры

    Пример #1 Создание Zip-архива

    = new ZipArchive ();
    $filename = «./test112.zip» ;

    if ( $zip -> open ( $filename , ZipArchive :: CREATE )!== TRUE ) <
    exit( «Невозможно открыть $filename >\n» );
    >

    $zip -> addFromString ( «testfilephp.txt» . time (), «#1 Это тестовая строка добавляется в качестве testfilephp.txt.\n» );
    $zip -> addFromString ( «testfilephp2.txt» . time (), «#2 Это тестовая строка добавляется в качестве testfilephp2.txt.\n» );
    $zip -> addFile ( $thisdir . «/too.php» , «/testfromfile.php» );
    echo «numfiles: » . $zip -> numFiles . «\n» ;
    echo «status:» . $zip -> status . «\n» ;
    $zip -> close ();
    ?>

    Пример #2 Собрать и отобразить подробную информацию об архиве

    $za -> open ( ‘test_with_comment.zip’ );
    print_r ( $za );
    var_dump ( $za );
    echo «numFiles: » . $za -> numFiles . «\n» ;
    echo «status: » . $za -> status . «\n» ;
    echo «statusSys: » . $za -> statusSys . «\n» ;
    echo «filename: » . $za -> filename . «\n» ;
    echo «comment: » . $za -> comment . «\n» ;

    for ( $i = 0 ; $i $za -> numFiles ; $i ++) <
    echo «index: $i \n» ;
    print_r ( $za -> statIndex ( $i ));
    >
    echo «numFile:» . $za -> numFiles . «\n» ;
    ?>

    Пример #3 Использование обертки потока Zip, чтение метаинформации OpenOffice

    $reader -> open ( ‘zip://’ . dirname ( __FILE__ ) . ‘/test.odt#meta.xml’ );
    $odt_meta = array();
    while ( $reader -> read ()) <
    if ( $reader -> nodeType == XMLREADER :: ELEMENT ) <
    $elm = $reader -> name ;
    > else <
    if ( $reader -> nodeType == XMLREADER :: END_ELEMENT && $reader -> name == ‘office:meta’ ) <
    break;
    >
    if (! trim ( $reader -> value )) <
    continue;
    >
    $odt_meta [ $elm ] = $reader -> value ;
    >
    >
    print_r ( $odt_meta );
    ?>

    Этот пример использует старую версию API (PHP 4), он открывает ZIP-архив, читает каждый файл в архиве и выводит его содержимое. Архив test2.zip , использованный в этом примере, является одним из тестовых архивов исходного дистрибутива ZZIPlib.

    Пример #4 Пример использования Zip

    if ( $zip ) <
    while ( $zip_entry = zip_read ( $zip )) <
    echo «Название: » . zip_entry_name ( $zip_entry ) . «\n» ;
    echo «Исходный размер: » . zip_entry_filesize ( $zip_entry ) . «\n» ;
    echo «Сжатый размер: » . zip_entry_compressedsize ( $zip_entry ) . «\n» ;
    echo «Метод сжатия: » . zip_entry_compressionmethod ( $zip_entry ) . «\n» ;

    if ( zip_entry_open ( $zip , $zip_entry , «r» )) <
    echo «Содержимое файла:\n» ;
    $buf = zip_entry_read ( $zip_entry , zip_entry_filesize ( $zip_entry ));
    echo » $buf \n» ;

    zip_entry_close ( $zip_entry );
    >
    echo «\n» ;


    User Contributed Notes 5 notes

    All these examples will not work if the php script has no write access within the folder.

    Although you may say this is obvious, I found that in this case, $zip->open(«name», ZIPARCHIVE::CREATE) doesn’t return an error as it might not try to access the file system but rather allocates memory.

    It is only $zip->close() that returns the error. This might cause you seeking at the wrong end.

    you can use this code for reading JAR files (java archives)

    JAR files use the same ZIP format, so can be easily read

    $zf = zip_open(realpath(‘D:/lucene/allinone/lucene-core.jar’)); $i=1;
    while($zf && $ze = zip_read($zf)) <
    $zi[$i][‘zip entry name’]= zip_entry_name($ze);
    $zi[$i][‘zip entry filesize’]= zip_entry_filesize($ze);
    $zi[$i][‘zip entry compressed size’]= zip_entry_compressedsize($ze);
    $zi[$i][‘zip entry compression method’]= zip_entry_compressionmethod($ze);
    $zi[$i][‘zip entry open status’] = zip_entry_open($zf,$ze);
    //$zi[$i][‘zip entry file contents’] = zip_entry_read($ze,100);
    $i++;
    >
    print_r($zi);
    zip_close($zf);

    1) If you want to add files to a ZIP archive but you don’t know if the ZiP file exists or not, you MUST check: this changes the way you open it !.
    2) you can not append multiple flags, can use only one (or none).

    If the zip does not exists, open it with:
    $ziph->open($archiveFile, ZIPARCHIVE::CM_PKWARE_IMPLODE)
    (or a different compression method)

    If the zip already exists, open it with:
    $ziph->open($archiveFile)
    or
    $ziph->open($archiveFile, ZIPARCHIVE::CHECKCONS)

    Example: make backup files every hour and ZIP them all in a daily ZIP archive, so you want to get only one ZIP per day, each ZIP containing 24 files:
    function archivebackup ( $archiveFile , $file , & $errMsg )
    <
    $ziph = new ZipArchive ();
    if( file_exists ( $archiveFile ))
    <
    if( $ziph -> open ( $archiveFile , ZIPARCHIVE :: CHECKCONS ) !== TRUE )
    <
    $errMsg = «Unable to Open $archiveFile » ;
    return 1 ;
    >
    >
    else
    <
    if( $ziph -> open ( $archiveFile , ZIPARCHIVE :: CM_PKWARE_IMPLODE ) !== TRUE )
    <
    $errMsg = «Could not Create $archiveFile » ;
    return 1 ;
    >
    >
    if(! $ziph -> addFile ( $file ))
    <
    $errMsg = «error archiving $file in $archiveFile » ;
    return 2 ;
    >
    $ziph -> close ();

    Работа с Zip в PHP. Архивация файла, папки

    Привет! В этой записи я опишу как производится работа с Zip в PHP.

    Рассмотрим некоторые случаи использования Zip в PHP:

    • архивирование файла
    • архивирование папки
    • распаковка zip архива

    Для работы представленных примеров должно быть включено расширение php_zip.

    Архивирование файла в Zip на PHP

    Создаем архив, добавляем в него файлы, а затем закрываем архив.

    Архивирование папки в Zip на PHP

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

    Указываем папку и куда положить архив:

    Распаковка Zip архива на PHP

    Указываем файл архива и папку для его распаковки:

    Работа с Zip в PHP не составит трудностей, особенно для наличии этой статьи �� Расширение php_zip облегчает жизнь разработчикам, которые столкнулись с необходимостью реализовать работу с архивами в PHP скриптах.

    PHP: Создание ZIP архивов на лету PHP

    В этом посту мы расскажем, как при помощи PHP создать ZIP архив из нескольких файлов. Это можно применить в коммерческих веб проектах: архивировать PDF, изображения, документы и так далее и отдавать на скачивание.

    HTML

    Форма состоит из списка чекбоксов с именем files[]:

    PHP

    Помещаем выбранные файлы в ZIP формат:

    $error .= «* Sorry ZIP creation failed at this time»;
    >
    foreach($post[‘files’] as $file)
    <
    $zip->addFile($file_folder.$file); // добавляем файлы в zip архив
    >
    $zip->close();
    if(file_exists($zip_name))
    <
    // отдаём файл на скачивание
    header(‘Content-type: application/zip’);
    header(‘Content-Disposition: attachment; filename=»‘.$zip_name.'»‘);
    readfile($zip_name);
    // удаляем zip файл если он существует
    unlink($zip_name);
    >

    >
    else
    $error .= «* Please select file to zip «;
    >
    else
    $error .= «* You dont have ZIP extension»;
    >
    ?>

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

    Уже долгие годы самым распространенным форматом сжатия данных, является формат ZIP. Данный формат широко используется в разработках под web. Поэтому многие языки для web-программирования имеют либо встроенные средства или возможности подключения необходимых библиотек для работы с zip-архивами.

    Непосредственно в самом PHP функций для распаковки и создания zip-архивов нету. Хотя это зависит, от вариантов его сборки. Но они присутствуют в PHP расширении “php_zip”. И именно оно позволяет работать с архивными zip-файлами.

    Распаковка архива

    С распаковкой архивов при веб разработке, приходиться сталкиваться наиболее часто, нежели при разработке прикладного ПО. Особенно когда возникает необходимость в пакетной загрузке данных (документы, сертификаты и т.д.). Ведь даже диалоговое окно для открытия файла в браузере, не имеет возможности мульти выбора файлов. Конечно, можно воспользоваться каким-либо flash-загрузчиком, но во многих ситуациях это не подходит. А значит остается всего один вариант – архивация данных. Для работы по распаковке архива есть ряд функций встроенных в расширение php_zip:

    Закрывает архивный zip-файл. Параметр zip обязан быть zip-архивом, открытым до этого функцией zip_open().

    Закрывает вхождение директории, специфицированное параметром zip_entry . Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_entry_open().

    int zip_entry_filesize (resource $zip_entry )

    Возвращает фактический размер вхождения директории zip_entry. Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_read().

    string zip_entry_name (resource $zip_entry )

    Возвращает имя вхождения директории zip_entry. Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_read().

    bool zip_entry_open (resource $zip , resource $zip_entry [, string $mode ])


    Открывает вхождение директории в zip-файле для чтения. Параметр zip это правильный дескриптор ресурса, возвращённый функцией zip_open(). Параметр zip_entry это ресурс вхождения директории, возвращённый функцией zip_read(). Необязательный параметр mode может быть одним из режимов, специфицированных в документации для fopen().

    Примечание: в настоящее время mode игнорируется и всегда имеет значение “rb”.Это из-за тог, что zip поддерживается в PHP с доступом только для чтения. Возвращает true при успехе, false при неудаче. В отличие от fopen() и других подобных функций, возвращаемое значение функции zip_entry_open() указывает только на результат операции и не нужно для чтения или закрытия вхождения директории.

    string zip_entry_read (resource $zip_entry [, int $length ])

    Читает до length байтов из открытого вхождения директории. Если параметр length не специфицирован, Функция zip_entry_read() пытается прочитать 1024 байта. Параметр zip_entry является правильным вхождением директории, возвращённым функцией zip_read(). Возвращает прочитанные данные, или false, если достигнут конец файла.

    Примечание: параметр length должен быть несжатым размером, который вы хотите прочитать.

    resource zip_open (string $filename )

    Открывает новый zip-архив для чтения. Параметр filename это имя файла открываемого zip-архива. Возвращает дескриптор ресурса для дальнейшего использования в zip_read() и zip_close(), или возвращает false, если filename не существует.

    resource zip_read (resource $zip )

    Читает следующее вхождение в файле zip-архива. Параметр zip обязан быть zip-архивом, открытым ранее функцией zip_open(). Возвращает ресурс вхождения директории для дальнейшего использования с zip_entry_… () функциями.

    int zip_entry_compressedsize(resource $zip_entry )

    Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_read(). Возвращает сжатый размер вхождения директории zip_entry.

    string zip_entry_compressionmethod (resource $zip_entry )

    Параметр zip_entry обязан быть правильным вхождением директории, открытым функцией zip_read(). Возвращает метод сжатия для вхождения директории zip_entry.

    Ниже приведен найденный и модифицированный мной исходный код функции для распаковки архива. Данная функция производит распаковку архива в корневой каталог. Поэтому если есть необходимость в создании директории для последующего расположения в ней распакованных файлов и каталогов, то ее требуется слегка изменить.

    Выше был продемонстрирован классический пример распаковки архива. Обратите внимание на то, что указанный к архиву путь, должен быть абсолютным. Но тем не менее существует еще одна возможность, чтобы его распаковать. Для этого нужно прибегнуть к помощи методов класса ZipArchive. Этот класс находится все в том же расширении “php_zip”. Итак для того чтобы применить другой вариант распаковки, необходимо написать следующий код:

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

    bool extractTo (string $destination [, mixed $entries ])

    Будущая директория местонахождения распакованного архива задается в параметре $destination . Параметр $entries содержит элементы для извлечения. Он является необязательным и может принимать как одно значение, так и массив значений.

    Второй вариант выглядит намного красивее и компактнее, чем первый, не так ли? Поэтому я свой выбор остановил именно на нем. И напоследок протестируем оба варианта на скорость распаковки архива объемом в 205Mb:

    Создание архива

    Создание архива происходит сложнее, чем его распаковка. Если конечно требуется создать архив с одним файлом или одной директорией, то здесь все просто. А вот если упаковывать директории с неограниченным уровнем вложенности каталогов, то здесь уже придется немного подумать. Во-первых, необходим хороший рекурсивный алгоритм для обхода директорий. Во-вторых, нужно дополнительно хранить локальное имя файла/каталога. Итак, для создания архива нам понадобятся четыре метода класса ZipArchive:

      bool addEmptyDir (string $dirname )

    Добавляет в архив пустую директорию. Параметр dirname должен содержать имя директории. Метод в случае успеха возвращает true или false в противном случае.

    vo >$filename [, string $localname = NULL [, int $start = 0 [, int $length = 0 ]]])

    Добавляет в архив файл, который находится по указанному в параметре filename пути. Параметр localname отвечает за имя файла в архиве. И если он указан, то параметр filename будет переопределен. Параметры start и length , зарезервированы для будущих целей. Данный метод так же в случае успеха возвращает true или false в случае ошибки.

    vo >$filename [, int $flags ])

    Данный метод необходим для открытия нового архива с целью: чтения, записи или создания. Параметр filename должен содержать имя архива. Необязательный параметр flags используется в качестве режима открытия файла (ZIPARCHIVE::OVERWRITE, ZIPARCHIVE::CREATE, ZIPARCHIVE::EXCL, ZIPARCHIVE::CHECKCONS). Метод возвращает true в случае успеха или код ошибки (см. предопределенные константы ошибок).

    vo >Этот метод закрывает открытый или созданный архив и сохраняет изменения. Данный метод автоматически вызывается в конце сценария.

    Ниже приведен исходный код созданного класса, позволяющего производить создание zip-архивов:

    Данный класс позволяет создавать архив из каталогов с неограниченным уровнем вложенности. Для создания архива, необходимо вызвать только один метод ToZip.

      bool ToZip (string $source , string $destination )

    Создает zip-архив. В параметре source требуется указать путь к каталогу или файлу, который требуется запаковать. А в качестве параметра destination передается имя будущего архива. Метод возвращает true в случае успеха или false в случае возникновения ошибки.

    Предопределенные константы режима работы

    ZIPARCHIVE::CREATE (integer) Создавать архив, если он не существует.
    ZIPARCHIVE::OVERWRITE (integer) Всегда создавать новый архив, этот режим перезаписывает файлы, если они существуют.
    ZIPARCHIVE::EXCL (integer) Выводить ошибку, если архив существует.
    ZIPARCHIVE::CHECKCONS (integer) Выполнять дополнительные проверки на структуру архива, и выдавать ошибку при неудаче.

    Предопределенные константы флагов

    ZIPARCHIVE::FL_NOCASE (integer) Игнорировать регистр символов в именах элементов архива.
    ZIPARCHIVE::FL_NODIR (integer) Не учитывать пути директорий в архиве.
    ZIPARCHIVE::FL_COMPRESSED (integer) Читать сжатые данные.
    ZIPARCHIVE::FL_UNCHANGED (integer) Использовать исходные данные, игнорируя изменения.

    Предопределенные константы методов сжатия

    ZIPARCHIVE::CM_DEFAULT (integer) Выбрать лучший метод сжатия deflate или stored (без сжатия).
    ZIPARCHIVE::CM_STORE (integer) Метод сжатия stored (без сжатия).
    ZIPARCHIVE::CM_SHRINK (integer) Метод сжатия shrunk.
    ZIPARCHIVE::CM_REDUCE_1 (integer) Метод сжатия reduced with factor 1.
    ZIPARCHIVE::CM_REDUCE_2 (integer) Метод сжатия reduced with factor 2.
    ZIPARCHIVE::CM_REDUCE_3 (integer) Метод сжатия reduced with factor 3.
    ZIPARCHIVE::CM_REDUCE_4 (integer) Метод сжатия reduced with factor 4.
    ZIPARCHIVE::CM_IMPLODE (integer) Метод сжатия imploded.
    ZIPARCHIVE::CM_DEFLATE (integer) Метод сжатия deflated.
    ZIPARCHIVE::CM_DEFLATE64 (integer) Метод сжатия deflate64.
    ZIPARCHIVE::CM_PKWARE_IMPLODE (integer) Метод сжатия PKWARE imploding.
    ZIPARCHIVE::CM_BZIP2 (integer) Метод сжатия алгоритмом BZIP2

    Предопределенные константы ошибок

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