список файлов в архиве php

Класс ZipArchive

(PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)

Введение

Файловый архив, сжатый Zip.

Обзор классов

Свойства

Значение индекса последней добавленной записи (файл или каталог). Доступно с PHP 8.0.0 и PECL zip 1.18.0.

Статус Zip-архива. Доступно для закрытого архива, начиная с PHP 8.0.0 и PECL zip 1.18.0.

Системный статус Zip-архива. Доступно для закрытого архива, начиная с PHP 8.0.0 и PECL zip 1.18.0.

Количество файлов в архиве

Имя файла в файловой системе

Комментарий к архиву

Содержание

User Contributed Notes 15 notes

Zip a folder (include itself).
Usage:
HZip::zipDir(‘/path/to/sourceDir’, ‘/path/to/out.zip’);

With PHP 5.6+, you may come up with theses errors.

Warning: Unknown: Cannot destroy the zip context in Unknown on line 0

Warning: ZipArchive::close(): Can’t remove file: No such file or directory in xxxx.php on line xx

Warning: Unknown: Cannot destroy the zip context in Unknown on line 0

So, don’t forget to put at least one file to your zip archive.

There is a usefull function to get the ZipArchive status as a human readable string :

The following code can be used to get a list of all the file names in a zip file.

Simple class xZip to zip big folders into multiple parts and unzip multi zip files at once.

public function __destruct () <>
>

//$zip = new xZip;
//$zip->zip(500, «images/», «images_zip/»);
//$zip->unzip(«images_zip/», «images/»);
?>

Read a file from an archive to a variable.
A warning is printed automatically in case of a CRC32 mismatch, which we capture, so we can print our own error message.

There is a limit withing PHP 5.3.3 (which seems to have been addressed in later versions; 5.3.29 seems ok on a different server).

If you try to open a zip file with more than 65,535 files in it (in my case it had 237,942 files) then you cannot access the later files. The numFiles property only reports the first 65k files.

Hi there.
I just wrote a little function to zip a whole folder while maintaining the dir-structure. I hope it might help someone.

3,6GB to be correct) of zip files, this class will generate corrupt files of the result is larger than 4 GB. Using tar.gz is a proper alternative.

Be wary that there are several algorithms to generate a zip file. I found that Office OpenXML files created with ZipArchive are not recognized by Excel 2007, for example.

You have to use a different class to zip in this case, such as PclZip.

You can check general purpose flag to test if the zip file is encrypted. Example function below.

How to detect corrupt files with CRC mismatch:

ZipArchive seems unable to detect broken files. ZipArchive::CHECKCONS doesn’t help, only if it’s not a ZIP file at all. It happily decompressed corrupt files in my tests and the user downloading the data is not informed.

Источник

RAR: получение списка файлов без PECL

Не так давно я писал о получении текста из всевозможных файловых форматов, будь то DOC или PDF. Сегодня мы рассмотрим не менее интересный формат — формат сжатия RAR. Не буду обнадёживать страждущих — сегодня мы только прочитаем список файлов без каких-либо дополнительных расширений PHP. Итак, кому интересно, прошу под кат.

RAR — хороший «плохой» архиватор

Напомню, что RAR разрабатывается нашим соотечественником Евгением Рошалом. От него же и получил своё имя Roshal Archiver. Формат закрытый, что абсолютно не сказалось на его распространении как в России, так и по миру. Почти все рабочие станции, что мне приходилось видеть, были с установленным и подчас крякнутым архиватором RAR.

За время своей разработки и бытности архиватор дорос до 3 ей (предположу, что скоро будет и 4 ая ) версии, что сказалось на большинстве «самопальных» разархиваторов: третья версия привнесла новые алгоритмы сжатия, от чего последние впадали в паранойю и ересь. Тем не менее сайт разработчика содержит достаточный объём всевозможных исходных кодов для разархивации RAR-файлов под разные платформы и среды разработки.

Что до PHP, то PECL-расширение доросло до «стабильной» первой версии и редко когда установлено на хостингах. Расширение, кстати, использует тот самый «unrar», чьи исходные коды лежат на сайте программы. Более того, признаюсь честно, мне не удалось запинать заставить работать расширение под 5.3 (под Windows), под 5.2.11 php_rar.dll заработало, но большинство архивов прочитать не смогло. Не удивлюсь, что все варианты скомпилированной библиотеки под Windows-систему были для «какой-то» другой версии, а компилировать самому не хотелось… поэтому под вечер я сел поглядеть, да посмотреть, что представляет из себя unrar.dll, что можно собрать из исходников на сайте.

RAR — как это?

В связи с закрытостью формата — документация по нему скудная, даже не смотря на тот факт, что исходные коды для разжатия данных есть. Что ж неудивительно — порядка 600 кб исходников рассматривать мало кому захочется. Но тем не менее энтузиасты таки есть (боже упаси, если вы подумали на мою персону 🙂 — поэтому в своё время был создан проект The UniquE RAR File Library, который в разы сократил исходные коды для разархивации файлов, созданных 2 ой версией архиватора.

Так вот мне попались на глаза исходники вышеупомянутой библиотеки, а также минимальная, но хоть какая-то, документация по престарелой 2.02 версии архиватора. Что ж, давайте погрузимся в то, как выглядят наши RAR-архивы.

RAR-архив состоит из блоков переменной длины с заголовками по 7 байт каждый. Любой архив содержит как минимум два блока MARK_HEAD и MAIN_HEAD. Первый содержит информацию о том, что перед нами RAR, и выглядит как » 52 61 72 21 1a 07 00 » в HEX’ах. Третий байт 0х72 как раз таки указывает на то, что это Marker Header. Слово 00 07 в little-endian содержит длину блока. Как раз таки 7 байт.

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

Сложно? Не очень, в сравнении с каким-нибудь DOC-файлов.

Исходный код

Код с комментариями вы можете получить на GitHub’е.

Литература

Ну и как обычно литература для ознакомления:

Источник

Типы архивов, которые меня интересуют:

4 ответа

Это то, что возникало раньше (по разным причинам, например, это и this и тот, в ответе есть неработающие ссылки).

Поскольку формат 7zip поддерживает множество алгоритмов сжатия, я предполагаю, что вы, вероятно, нужна чистая реализация PHP для чтения / распаковки формата LZMA. Хотя существуют LZMA SDK, доступные для C, C ++, C # и Java, и кто-то сделал расширение PHP для LZMA2 (и fork для LZMA), несмотря на то, что был даже интерес на форумах 7-zip довольно долгое время, но никто, похоже, не перенес это как всеобъемлющее расширение PECL или чистый PHP пока нет.

В зависимости от ваших потребностей и мотивации это оставляет вам:

Для других форматов вы можете посмотреть в документации PHP примеры и подробности использования:

Поскольку все они включают расширения PECL, если вы каким-то образом ограничены вашим веб-хостом и для этого вам нужны чистые PHP-решения, может быть проще просто перейти на более удобный веб-хост.

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

ZIP (адаптировано из вопроса OP, который находится здесь):

Я думаю, что этот класс может вам помочь

Пример кода по ссылке

На сайте ClamavNet я нашел эту информацию

Тем не менее, мой опыт загрузки файлов исходит от обычно доверенных пользователей. Zip-бомбы или любые другие угрозы, на вашем месте я сначала изучу их и выясню, как работают zip-бомбы / любые другие угрозы, это поможет вам предотвратить их с помощью дополнительного кода или решения.

Более того, в зависимости от размера вашего бизнеса, бюджета и того, насколько критично ваше веб-приложение, рекомендуется создать на вашем сайте своего рода стратегию, политику и роли, которые описывают использование вашего веб-приложения. Частью этого является политика загрузки файлов, например, какой тип файлов разрешено загружать, каков максимальный размер, кто может загружать и принимает ваше заявление об отказе от ответственности, где вы упоминаете эти материалы и т. Д., Эта политика должна быть отражена в качестве руководства для аудитории, использующей ваш сервисы веб-приложений.

Вот несколько ссылок о zip-бомбах:

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

После того, как вы собрали разношерстный набор утилит и проверили код до разумного уровня, вам следует украсить реализацию унифицированным API, чтобы гарантировать, что ваш связующий код не превратится в спагетти.

Источник

Как выглядит zip-архив и что мы с этим можем сделать. Часть 4 — Чтение архива

Продолжение цикла о Zip-архивах и PHP. Предыдущие статьи: Часть 1, Часть 2, Часть 3

Доброго времени суток, дорогие читатели.
На этот раз я хотел бы представить, наверное, заключительную часть цикла о Zip-архивах и PHP.

В этой статье я покажу как прочесть уже существующий архив и для примера мы возьмем photos.zip из прошлой статьи. Чтоб не повторять все процедуры воспользуемся готовым — https://github.com/userqq/images/raw/master/photos.zip.

А теперь давайте на минутку отвлечемся и вспомним, из чего состоит наш архив: сначала идет набор данных упакованных файлов, где каждый упакованный файл предварён структурой Local File Header (LFH), после всех данных у нас идет набор структур Central Directory File Header (CDFH) — это такое оглавление по нашему архиву, в котором перечислены все элементы и позиции их смещения относительно начала файла. А завершает архив End Of Central Directory Record (EOCD) — тут указана позиция начала структур CDFH, их количество и общая длина в байтах. Поэтому архив следует читать с конца, чтоб сначала найти EOCD, потом прочесть структуры CDFH и таким образом получить список файлов в архиве.

FYI: А некоторые форматы, например JPEG, читаются с начала. Поэтому мы можем склеить картинку с архивом, даже банально через cat image.jpeg archive.zip > imagearchive.jpeg, не потеряв функционала. Браузеры и приложения для просмотра картинок будут без каких-либо проблем показывать нам картинку. В то время как любое приложение для чтения zip-архивов, будь то 7z или unzip, сможет преспокойно работать с файлом как с архивом. Например, вот — https://github.com/userqq/images/blob/master/jpegarchive.jpg (Осторожно, эта штука весит около 20мб, поэтому не советую открывать с телефонов или если вам дорог трафик). Таким образом, если вы знаете хостинг картинок, на котором изображения не перекодируются и не обрезаются, вы можете заливать туда не только картинки:) Хотя, мне кажется, сейчас таких уже не найти.

Для начала определим вспомогательную функцию, которая несколько облегчит нам работу с unpack (я подсмотрел эту идею у clue в каком-то из репозиториев для работы с socks и немного модицифировал для нашего случая):

Теперь попробуем найти структуру EOCD. Минимальная её длина, если отсутствует комментарий, будет 22 байта, из которых первые 4 это сигнатура. Поэтому сначала мы смещаемся на позицию filesize($file) — 22, читаем следующие 4 байта и, если нам повезло и эти байты равны сигнатуре (0x06054b50), значит это и есть наша EOCD. Если не повезло — побайтово двигаемся к началу файла, пока не найдем или не закончится файл — тогда, наверное, это не архив.

Теперь мы знаем сколько у нас элементов в архиве и где начинается «оглавление» — список CDFH структур. Мы можем их перебрать и получить имена, размер данных и позицию начала LFH для каждого из элементов архива.

Вообще бегать по файлу туда-сюда для каждой из записей — не самая лучшая идея с точки зрения быстродействия, поэтому я бы рекомендовал прочесть все CDFH структуры, а потом уже перейти перейти к чтению LFH и данных, если это необходимо, но у нас тут «Нетрадиционное программирование», поэтому нам можно.

В результате работы скрипта мы должны получить информацию об архиве примерно следующего вида:

И, в общем-то благодаря этим данным мы уже можем извлечь все или конкретный файл.

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

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

И я надеюсь, что вам хоть и немного, но все же было интересно:)

Источник

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

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

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

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

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

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

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

Рис.1 The archive1.zip

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

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

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

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

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

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

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

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

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

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

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

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

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

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

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

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

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

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

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

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

Для удаления или переименования Zip архивов в PHP можно использовать имя или индекс. Методы, которыми можно воспользоваться для этой цели, включают:

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

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

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

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

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

список файлов в архиве php. Смотреть фото список файлов в архиве php. Смотреть картинку список файлов в архиве php. Картинка про список файлов в архиве php. Фото список файлов в архиве php

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

Заключение

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

Источник

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

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