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

Я хочу перечислить файлы внутри архива, без их извлечения.

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

Решение

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

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

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

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

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

ZIP (адаптировано из вопроса ОП, который Вот ):

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

я думаю это учебный класс может помочь тебе

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

Обновить
Как и было обещано в моих комментариях и ОП попросил один из способов проверить загруженные файлы на наличие бомбы, вот ссылка на сайт которые описывают это. Это ClamAV® — антивирусный движок с открытым исходным кодом для обнаружения троянов, вирусов, вредоносных программ. & другие вредоносные угрозы исходный антивирус.

С сайта ClamavNet я нашел этот Информация

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

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

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

Комментарий Арнульда является подсказкой о наиболее практичном способе решения проблемы. Даже если вы можете найти реализации всех возможных типов архивов, которые вы хотите поддерживать, доступные для PHP, только PHP и gzip изначально поддерживаются расширением PHP. Остальная часть будет либо собственным PHP-кодом, либо оболочкой для вызова автономного двоичного файла. Первый будет немного узким местом производительности / ресурсов, а второй будет зависеть от вашей базовой платформы.

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

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

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

Источник

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

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, чтобы гарантировать, что ваш связующий код не превратится в спагетти.

Источник

Класс 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’е.

Литература

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

Источник

ZipArchive::open

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

ZipArchive::open — Открывает ZIP-архив

Описание

Открывает новый или существующий ZIP-архив для чтения, записи или изменения.

Начиная с libzip 1.6.0, пустой файл больше не является корректным архивом.

Список параметров

Имя ZIP-архива для открытия.

Используемый режим открытия файлов.

    Возвращаемые значения

    Возвращает true в случае успешного выполнения или один из следующих кодов ошибки: ZipArchive::ER_EXISTS Файл уже существует. ZipArchive::ER_INCONS Несовместимый ZIP-архив. ZipArchive::ER_INVAL Недопустимый аргумент. ZipArchive::ER_MEMORY Ошибка динамического выделения памяти. ZipArchive::ER_NOENT Нет такого файла. ZipArchive::ER_NOZIP Не является ZIP-архивом. ZipArchive::ER_OPEN Невозможно открыть файл. ZipArchive::ER_READ Ошибка чтения. ZipArchive::ER_SEEK Ошибка поиска.

    Примеры

    Пример #1 Открытие и извлечение

    Пример #2 Создание архива

    Пример #3 Создать временный архив

    User Contributed Notes 21 notes

    With php 5.2.6, the following code created a new zip or replaced a existing zip.
    Note that I am only using the ZIPARCHIVE::OVERWRITE flag.

    Warning: ZipArchive::addFromString() [ziparchive.addfromstring]: Invalid or unitialized Zip object in [myfile] on line [myline]

    To fix this, you must specify the flags as create or overwrite.

    #made by abolfazl ziaratban (c)
    #license GPL

    case 1 :
    return ‘Multi-disk zip archives not supported’ ;

    case 2 :
    return ‘Renaming temporary file failed’ ;

    case 3 :
    return ‘Closing zip archive failed’ ;

    case 4 :
    return ‘Seek error’ ;

    case 5 :
    return ‘Read error’ ;

    case 6 :
    return ‘Write error’ ;

    case 7 :
    return ‘CRC error’ ;

    case 8 :
    return ‘Containing zip archive was closed’ ;

    case 9 :
    return ‘No such file’ ;

    case 10 :
    return ‘File already exists’ ;

    case 11 :
    return ‘Can\’t open file’ ;

    case 12 :
    return ‘Failure to create temporary file’ ;

    case 13 :
    return ‘Zlib error’ ;

    case 14 :
    return ‘Malloc failure’ ;

    case 15 :
    return ‘Entry has been changed’ ;

    case 16 :
    return ‘Compression method not supported’ ;

    case 17 :
    return ‘Premature EOF’ ;

    case 18 :
    return ‘Invalid argument’ ;

    case 19 :
    return ‘Not a zip archive’ ;

    case 20 :
    return ‘Internal error’ ;

    case 21 :
    return ‘Zip archive inconsistent’ ;

    case 22 :
    return ‘Can\’t remove file’ ;

    case 23 :
    return ‘Entry has been deleted’ ;

    If you have archives that you want to overwrite just use:

    It will overwrite existing archives and at the same time create new ones if they don’t already exist.

    ZIPARCHIVE::OVERWRITE won’t work for both of these scenarios.

    if you are echoing out the output and confused about the number. maybe this will help. i’m not totally sure it is accurate though.

    If the directory you are writing or saving into does not have the correct permissions set, you won’t get any error messages and it will look like everything worked fine. except it won’t have changed!

    Instead make sure you collect the return value of ZipArchive::close(). If it is false. it didn’t work.

    case ZipArchive :: ER_INCONS :
    $ErrMsg = «Zip archive inconsistent.» ;
    break;

    case ZipArchive :: ER_MEMORY :
    $ErrMsg = «Malloc failure.» ;
    break;

    case ZipArchive :: ER_NOENT :
    $ErrMsg = «No such file.» ;
    break;

    case ZipArchive :: ER_NOZIP :
    $ErrMsg = «Not a zip archive.» ;
    break;

    case ZipArchive :: ER_OPEN :
    $ErrMsg = «Can’t open file.» ;
    break;

    case ZipArchive :: ER_READ :
    $ErrMsg = «Read error.» ;
    break;

    case ZipArchive :: ER_SEEK :
    $ErrMsg = «Seek error.» ;
    break;

    If on PHP 8.0+, you can use match expression to decode status code:

    $zipfilename=$dir.DIRECTORY_SEPARATOR.»test.zip»;
    $zippedFile = new ZipArchive;
    $zippedFile->open($zipfilename);

    Note that ZipArchive does not support generating streaming ZIP file content (i.e. start sending data to the user as soon as you start generating it such as from a database). This means you have to write the entire file to disk first and then send the file to the user. Doing that can take a while depending on how much data there is, which could run up against server timeout limits.

    There are a couple of PHP userland libraries available on GitHub that can stream ZIP file content out to the user as soon as any data is written to the relevant classes.

    Maybe a future version of ZipArchive will offer something similar.

    ZipArchive::OVERWRITE does NOT mean an existing file would be deleted when ZipArchive::open() is called.

    In fact, the existing file will be deleted before PHP saves the zip archive on disk.

    PHP takes these steps to finish zipping:

    1. When ZipArchive::open(‘xx.zip’) is called
    If ‘xx.zip’ exists and is a zip archive, it will be opened and read as a temporary zip file,
    If the file does not exist, and ZipArchive::CREATE is applied, php will create a temporary empty zip file
    In these cases, ZipArchive::open() returns true, otherwise it returns an integer error code.
    2. Adds file(s) to the temporary zip file when methods such as addFile(), addFromString() are called.
    3. Deletes the existing file before saving the temporary zip file on disk.
    4. Save the temporary zip file on disk
    5. Closes the active archive when ZipArchive::close() is called or at the end of the script

    Since PHP does NOT delete the existing file before saving the zip archive on disk, you should use unset() to delete it if you want to zip that file’s containing folder and save the zip archive in that folder, otherwise you will get a larger and larger zip archive everytime you refresh the page.

    Источник

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

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