<h1 align="center"><img src="logo.svg" alt="PhpZip" width="250" height="51"></h1>`PhpZip` - php библиотека для продвинутой работы с ZIP-архивами.English DocumentationСодержание----------ФункционалТребованияУстановкаПримерыГлоссарийДокументация + Обзор методов класса `\PhpZip\ZipFile` + Создание/Открытие ZIP-архива + Чтение записей из архива + Перебор записей/Итератор + Получение информации о записях + Добавление записей в архив + Удаление записей из архива + Работа с записями и с архивом + Работа с паролями + Отмена изменений + Сохранение файла или вывод в браузер + Закрытие архиваЗапуск тестовИстория измененийОбновление версий + Обновление с версии 3 до версии 4 + Обновление с версии 2 до версии 3ФункционалОткрытие и разархивирование ZIP-архивов.Создание ZIP-архивов.Модификация ZIP-архивов.Чистый php (не требуется расширение `php-zip` и класс `\ZipArchive`).Поддерживается сохранение архива в файл, вывод архива в браузер или вывод в виде строки, без сохранения в файл.Поддерживаются комментарии архива и комментарии отдельных записей.Получение подробной информации о каждой записи в архиве.Поддерживаются только следующие методы сжатия: + Без сжатия (Stored). + Deflate сжатие. + BZIP2 сжатие при наличии расширения `php-bz2`.Поддержка `ZIP64` (размер файла более 4 GB или количество записей в архиве более 65535).Работа с паролямиВнимание! >Для 32-bit систем, в данный момент не поддерживается метод шифрование `Traditional PKWARE Encryption (ZipCrypto)`.Используйте метод шифрования `WinZIP AES Encryption`, когда это возможно. + Установка пароля для чтения архива глобально или для некоторых записей. + Изменение пароля архива, в том числе и для отдельных записей. + Удаление пароля архива глобально или для отдельных записей. + Установка пароля и/или метода шифрования, как для всех, так и для отдельных записей в архиве. + Установка разных паролей и методов шифрования для разных записей. + Удаление пароля для всех или для некоторых записей. + Поддержка методов шифрования `Traditional PKWARE Encryption (ZipCrypto)` и `WinZIP AES Encryption (128, 192 или 256 bit)`. + Установка метода шифрования для всех или для отдельных записей в архиве.Требования`PHP` 7.4 или ^8.0 (предпочтительно 64-bit).Опционально php-расширение `bzip2` для поддержки BZIP2 компрессии.Опционально php-расширение `openssl` для `WinZip Aes Encryption` шифрования.Установка`composer require nelexa/zip`Последняя стабильная версия: Примеры// создание нового архива $zipFile = new \PhpZip\ZipFile(); try{ $zipFile ->addFromString('zip/entry/filename', "Is file content") // добавить запись из строки ->addFile('/path/to/file', 'data/tofile') // добавить запись из файла ->addDir(__DIR__, 'to/path/') // добавить файлы из директории ->saveAsFile($outputFilename) // сохранить архив в файл ->close(); // закрыть архив // открытие архива, извлечение файлов, удаление файлов, добавление файлов, установка пароля и вывод архива в браузер. $zipFile ->openFile($outputFilename) // открыть архив из файла ->extractTo($outputDirExtract) // извлечь файлы в заданную директорию ->deleteFromRegex('~^\.~') // удалить все скрытые (Unix) файлы ->addFromString('dir/file.txt', 'Test file') // добавить новую запись из строки ->setPassword('password') // установить пароль на все записи ->outputAsAttachment('library.jar'); // вывести в браузер без сохранения в файл } catch(\PhpZip\Exception\ZipException $e){ // обработка исключения } finally{ $zipFile->close(); } Другие примеры можно посмотреть в папке `tests/`.ГлоссарийЗапись в ZIP-архиве (Zip Entry) - файл или папка в ZIP-архиве. У каждой записи в архиве есть определённые свойства, например: имя файла, метод сжатия, метод шифрования, размер файла до сжатия, размер файла после сжатия, CRC32 и другие.ДокументацияОбзор методов класса `\PhpZip\ZipFile`ZipFile::__construct - инициализирует ZIP-архив.ZipFile::addAll - добавляет все записи из массива.ZipFile::addDir - добавляет файлы из директории по указанному пути без вложенных директорий.ZipFile::addDirRecursive - добавляет файлы из директории по указанному пути с вложенными директориями.ZipFile::addEmptyDir - добавляет в ZIP-архив новую директорию.ZipFile::addFile - добавляет в ZIP-архив файл по указанному пути.ZipFile::addSplFile - добавляет объект `\SplFileInfo` в zip-архив.ZipFile::addFromFinder - добавляет файлы из `Symfony\Component\Finder\Finder` в zip архив.ZipFile::addFilesFromIterator - добавляет файлы из итератора директорий.ZipFile::addFilesFromGlob - добавляет файлы из директории в соответствии с glob шаблоном без вложенных директорий.ZipFile::addFilesFromGlobRecursive - добавляет файлы из директории в соответствии с glob шаблоном c вложенными директориями.ZipFile::addFilesFromRegex - добавляет файлы из директории в соответствии с регулярным выражением без вложенных директорий.ZipFile::addFilesFromRegexRecursive - добавляет файлы из директории в соответствии с регулярным выражением с вложенными директориями.ZipFile::addFromStream - добавляет в ZIP-архив запись из потока.ZipFile::addFromString - добавляет файл в ZIP-архив, используя его содержимое в виде строки.ZipFile::close - закрывает ZIP-архив.ZipFile::count - возвращает количество записей в архиве.ZipFile::deleteFromName - удаляет запись по имени.ZipFile::deleteFromGlob - удаляет записи в соответствии с glob шаблоном.ZipFile::deleteFromRegex - удаляет записи в соответствии с регулярным выражением.ZipFile::deleteAll - удаляет все записи в ZIP-архиве.ZipFile::disableEncryption - отключает шифрования всех записей, находящихся в архиве.ZipFile::disableEncryptionEntry - отключает шифрование записи по её имени.ZipFile::extractTo - извлекает содержимое архива в заданную директорию.ZipFile::getArchiveComment - возвращает комментарий ZIP-архива.ZipFile::getEntryComment - возвращает комментарий к записи, используя её имя.ZipFile::getEntryContent - возвращает содержимое записи.ZipFile::getListFiles - возвращает список файлов архива.ZipFile::hasEntry - проверяет, присутствует ли запись в архиве.ZipFile::isDirectory - проверяет, является ли запись в архиве директорией.ZipFile::matcher - выборка записей в архиве для проведения операций над выбранными записями.ZipFile::openFile - открывает ZIP-архив из файла.ZipFile::openFromString - открывает ZIP-архив из строки.ZipFile::openFromStream - открывает ZIP-архив из потока.ZipFile::outputAsAttachment - выводит ZIP-архив в браузер.ZipFile::outputAsPsr7Response - выводит ZIP-архив, как PSR-7 Response.ZipFile::outputAsSymfonyResponse - выводит ZIP-архив, как Symfony Response.ZipFile::outputAsString - выводит ZIP-архив в виде строки.ZipFile::rename - переименовывает запись по имени.ZipFile::rewrite - сохраняет изменения и заново открывает изменившийся архив.ZipFile::saveAsFile - сохраняет архив в файл.ZipFile::saveAsStream - записывает архив в поток.ZipFile::setArchiveComment - устанавливает комментарий к ZIP-архиву.ZipFile::setCompressionLevel - устанавливает уровень сжатия для всех файлов, находящихся в архиве.ZipFile::setCompressionLevelEntry - устанавливает уровень сжатия для определённой записи в архиве.ZipFile::setCompressionMethodEntry - устанавливает метод сжатия для определённой записи в архиве.ZipFile::setEntryComment - устанавливает комментарий к записи, используя её имя.ZipFile::setReadPassword - устанавливает пароль на чтение открытого запароленного архива для всех зашифрованных записей.ZipFile::setReadPasswordEntry - устанавливает пароль на чтение конкретной зашифрованной записи открытого запароленного архива.ZipFile::setPassword - устанавливает новый пароль для всех файлов, находящихся в архиве.ZipFile::setPasswordEntry - устанавливает новый пароль для конкретного файла.ZipFile::unchangeAll - отменяет все изменения, сделанные в архиве.ZipFile::unchangeArchiveComment - отменяет изменения в комментарии к архиву.ZipFile::unchangeEntry - отменяет изменения для конкретной записи архива.Создание/Открытие ZIP-архиваZipFile::__constructИнициализирует ZIP-архив.$zipFile = new \PhpZip\ZipFile(); ZipFile::openFileОткрывает ZIP-архив из файла.$zipFile = new \PhpZip\ZipFile(); $zipFile->openFile('file.zip'); ZipFile::openFromStringОткрывает ZIP-архив из строки.$zipFile = new \PhpZip\ZipFile(); $zipFile->openFromString($stringContents); ZipFile::openFromStreamОткрывает ZIP-архив из потока.$stream = fopen('file.zip', 'rb'); $zipFile = new \PhpZip\ZipFile(); $zipFile->openFromStream($stream); Чтение записей из архиваZipFile::countВозвращает количество записей в архиве.$zipFile = new \PhpZip\ZipFile(); $count = count($zipFile); // или $count = $zipFile->count(); ZipFile::getListFilesВозвращает список файлов архива.$zipFile = new \PhpZip\ZipFile(); $listFiles = $zipFile->getListFiles(); // Пример содержимого массива: // array ( // 0 => 'info.txt', // 1 => 'path/to/file.jpg', // 2 => 'another path/', // ) ZipFile::getEntryContentВозвращает содержимое записи.// $entryName = 'path/to/example-entry-name.txt'; $zipFile = new \PhpZip\ZipFile(); $contents = $zipFile[$entryName]; // или $contents = $zipFile->getEntryContents($entryName); ZipFile::hasEntryПроверяет, присутствует ли запись в архиве.// $entryName = 'path/to/example-entry-name.txt'; $zipFile = new \PhpZip\ZipFile(); $hasEntry = isset($zipFile[$entryName]); // или $hasEntry = $zipFile->hasEntry($entryName); ZipFile::isDirectoryПроверяет, является ли запись в архиве директорией.// $entryName = 'path/to/'; $zipFile = new \PhpZip\ZipFile(); $isDirectory = $zipFile->isDirectory($entryName); ZipFile::extractToИзвлекает содержимое архива в заданную директорию.Директория должна существовать.$zipFile = new \PhpZip\ZipFile(); $zipFile->extractTo($directory); Можно извлечь только некоторые записи в заданную директорию.Директория должна существовать.$extractOnlyFiles = [ 'filename1', 'filename2', 'dir/dir/dir/' ]; $zipFile = new \PhpZip\ZipFile(); $zipFile->extractTo($toDirectory, $extractOnlyFiles); Перебор записей/Итератор`ZipFile` является итератором.Можно перебрать все записи, через цикл `foreach`.foreach($zipFile as $entryName => $contents){ echo "Файл: $entryName" . PHP_EOL; echo "Содержимое: $contents" . PHP_EOL; echo '-----------------------------' . PHP_EOL; } Можно использовать паттерн `Iterator`.$iterator = new \ArrayIterator($zipFile); while ($iterator->valid()) { $entryName = $iterator->key(); $contents = $iterator->current(); echo "Файл: $entryName" . PHP_EOL; echo "Содержимое: $contents" . PHP_EOL; echo '-----------------------------' . PHP_EOL; $iterator->next(); } Получение информации о записяхZipFile::getArchiveCommentВозвращает комментарий ZIP-архива.$commentArchive = $zipFile->getArchiveComment(); ZipFile::getEntryCommentВозвращает комментарий к записи, используя её имя.$commentEntry = $zipFile->getEntryComment($entryName); Добавление записей в архивВсе методы добавления записей в ZIP-архив позволяют указать метод сжатия содержимого.Доступны следующие методы сжатия:`\PhpZip\Constants\ZipCompressionMethod::STORED` - без сжатия`\PhpZip\Constants\ZipCompressionMethod::DEFLATED` - Deflate сжатие`\PhpZip\Constants\ZipCompressionMethod::BZIP2` - Bzip2 сжатие при наличии расширения `ext-bz2`ZipFile::addFileДобавляет в ZIP-архив файл по указанному пути из файловой системы.$zipFile = new \PhpZip\ZipFile(); // $file = '...../file.ext'; $zipFile->addFile($file); // можно указать имя записи в архиве (если null, то используется последний компонент из имени файла) $zipFile->addFile($file, $entryName); // можно указать метод сжатия $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие ZipFile::addSplFile"Добавляет объект `\SplFileInfo` в zip-архив.// $file = '...../file.ext'; // $entryName = 'file2.ext' $zipFile = new \PhpZip\ZipFile(); $splFile = new \SplFileInfo('README.md'); $zipFile->addSplFile($splFile); $zipFile->addSplFile($splFile, $entryName); // or $zipFile[$entryName] = new \SplFileInfo($file); // установить метод сжатия $zipFile->addSplFile($splFile, $entryName, $options = [ \PhpZip\Constants\ZipOptions::COMPRESSION_METHOD => \PhpZip\Constants\ZipCompressionMethod::DEFLATED, ]); ZipFile::addFromFinder"Добавляет файлы из `Symfony\Component\Finder\Finder` в zip архив.$finder = new \Symfony\Component\Finder\Finder(); $finder ->files() ->name('*.{jpg,jpeg,gif,png}') ->name('/^[0-9a-f]\./') ->contains('/lorem\s+ipsum$/i') ->in('path'); $zipFile = new \PhpZip\ZipFile(); $zipFile->addFromFinder($finder, $options = [ \PhpZip\Constants\ZipOptions::COMPRESSION_METHOD => \PhpZip\Constants\ZipCompressionMethod::DEFLATED, \PhpZip\Constants\ZipOptions::MODIFIED_TIME => new \DateTimeImmutable('-1 day 5 min') ]); ZipFile::addFromStringДобавляет файл в ZIP-архив, используя его содержимое в виде строки.$zipFile = new \PhpZip\ZipFile(); $zipFile[$entryName] = $contents; // или $zipFile->addFromString($entryName, $contents); // можно указать метод сжатия $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие ZipFile::addFromStreamДобавляет в ZIP-архив запись из потока.// $stream = fopen(..., 'rb'); $zipFile->addFromStream($stream, $entryName); // можно указать метод сжатия $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие ZipFile::addEmptyDirДобавляет в ZIP-архив новую (пустую) директорию.// $path = "path/to/"; $zipFile->addEmptyDir($path); // или $zipFile[$path] = null; ZipFile::addAllДобавляет все записи из массива.$entries = [ 'file.txt' => 'file contents', // запись из строки данных 'empty dir/' => null, // пустой каталог 'path/to/file.jpg' => fopen('..../filename', 'rb'), // запись из потока 'path/to/file.dat' => new \SplFileInfo('..../filename'), // запись из файла ]; $zipFile->addAll($entries); ZipFile::addDirДобавляет файлы из директории по указанному пути без вложенных директорий.$zipFile->addDir($dirName); // можно указать путь в архиве в который необходимо поместить записи $localPath = "to/path/"; $zipFile->addDir($dirName, $localPath); // можно указать метод сжатия $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие ZipFile::addDirRecursiveДобавляет файлы из директории по указанному пути c вложенными директориями.$zipFile->addDirRecursive($dirName); // можно указать путь в архиве в который необходимо поместить записи $localPath = "to/path/"; $zipFile->addDirRecursive($dirName, $localPath); // можно указать метод сжатия $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие ZipFile::addFilesFromIteratorДобавляет файлы из итератора директорий.// $directoryIterator = new \DirectoryIterator($dir); // без вложенных директорий // $directoryIterator = new \RecursiveDirectoryIterator($dir); // с вложенными директориями $zipFile->addFilesFromIterator($directoryIterator); // можно указать путь в архиве в который необходимо поместить записи $localPath = "to/path/"; $zipFile->addFilesFromIterator($directoryIterator, $localPath); // или $zipFile[$localPath] = $directoryIterator; // можно указать метод сжатия $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие Пример добавления файлов из директории в архив с игнорированием некоторых файлов при помощи итератора директорий.$ignoreFiles = [ "file_ignore.txt", "dir_ignore/sub dir ignore/" ]; // $directoryIterator = new \DirectoryIterator($dir); // без вложенных директорий // $directoryIterator = new \RecursiveDirectoryIterator($dir); // с вложенными директориями // используйте \PhpZip\Util\Iterator\IgnoreFilesFilterIterator для не рекурсивного поиска $ignoreIterator = new \PhpZip\Util\Iterator\IgnoreFilesRecursiveFilterIterator( $directoryIterator, $ignoreFiles ); $zipFile->addFilesFromIterator($ignoreIterator); ZipFile::addFilesFromGlobДобавляет файлы из директории в соответствии с glob шаблоном) без вложенных директорий.$globPattern = '**.{jpg,jpeg,png,gif}'; // пример glob шаблона -> добавить все .jpg, .jpeg, .png и .gif файлы $zipFile->addFilesFromGlob($dir, $globPattern); // можно указать путь в архиве в который необходимо поместить записи $localPath = "to/path/"; $zipFile->addFilesFromGlob($dir, $globPattern, $localPath); // можно указать метод сжатия $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие ZipFile::addFilesFromGlobRecursiveДобавляет файлы из директории в соответствии с glob шаблоном) c вложенными директориями.$globPattern = '**.{jpg,jpeg,png,gif}'; // пример glob шаблона -> добавить все .jpg, .jpeg, .png и .gif файлы $zipFile->addFilesFromGlobRecursive($dir, $globPattern); // можно указать путь в архиве в который необходимо поместить записи $localPath = "to/path/"; $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath); // можно указать метод сжатия $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие ZipFile::addFilesFromRegexДобавляет файлы из директории в соответствии с регулярным выражением без вложенных директорий.$regexPattern = '/\.(jpe?g|png|gif)$/si'; // пример регулярного выражения -> добавить все .jpg, .jpeg, .png и .gif файлы $zipFile->addFilesFromRegex($dir, $regexPattern); // можно указать путь в архиве в который необходимо поместить записи $localPath = "to/path/"; $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath); // можно указать метод сжатия $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие ZipFile::addFilesFromRegexRecursiveДобавляет файлы из директории в соответствии с регулярным выражением с вложенными директориями.$regexPattern = '/\.(jpe?g|png|gif)$/si'; // пример регулярного выражения -> добавить все .jpg, .jpeg, .png и .gif файлы $zipFile->addFilesFromRegexRecursive($dir, $regexPattern); // можно указать путь в архиве в который необходимо поместить записи $localPath = "to/path/"; $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath); // можно указать метод сжатия $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // Без сжатия $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate сжатие $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 сжатие Удаление записей из архиваZipFile::deleteFromNameУдаляет запись по имени.$zipFile->deleteFromName($entryName); ZipFile::deleteFromGlobУдаляет записи в соответствии с glob шаблоном).$globPattern = '**.{jpg,jpeg,png,gif}'; // пример glob шаблона -> удалить все .jpg, .jpeg, .png и .gif файлы $zipFile->deleteFromGlob($globPattern); ZipFile::deleteFromRegexУдаляет записи в соответствии с регулярным выражением.$regexPattern = '/\.(jpe?g|png|gif)$/si'; // пример регулярному выражения -> удалить все .jpg, .jpeg, .png и .gif файлы $zipFile->deleteFromRegex($regexPattern); ZipFile::deleteAllУдаляет все записи в ZIP-архиве.$zipFile->deleteAll(); Работа с записями и с архивомZipFile::renameПереименовывает запись по имени.$zipFile->rename($oldName, $newName); ZipFile::setCompressionLevelУстанавливает уровень сжатия для всех файлов, находящихся в архиве._Обратите внимание, что действие данного метода не распространяется на записи, добавленные после выполнения этого метода._По умолчанию используется уровень сжатия 5 (`\PhpZip\Constants\ZipCompressionLevel::NORMAL`) или уровень сжатия, определённый в архиве для Deflate сжатия.Поддерживаются диапазон значений от 1 (`\PhpZip\Constants\ZipCompressionLevel::SUPER_FAST`) до 9 (`\PhpZip\Constants\ZipCompressionLevel::MAXIMUM`). Чем выше число, тем лучше и дольше сжатие.$zipFile->setCompressionLevel(\PhpZip\Constants\ZipCompressionLevel::MAXIMUM); ZipFile::setCompressionLevelEntryУстанавливает уровень сжатия для определённой записи в архиве.Поддерживаются диапазон значений от 1 (`\PhpZip\Constants\ZipCompressionLevel::SUPER_FAST`) до 9 (`\PhpZip\Constants\ZipCompressionLevel::MAXIMUM`). Чем выше число, тем лучше и дольше сжатие.$zipFile->setCompressionLevelEntry($entryName, \PhpZip\Constants\ZipCompressionLevel::MAXIMUM); ZipFile::setCompressionMethodEntryУстанавливает метод сжатия для определённой записи в архиве.Доступны следующие методы сжатия:`\PhpZip\Constants\ZipCompressionMethod::STORED` - без сжатия`\PhpZip\Constants\ZipCompressionMethod::DEFLATED` - Deflate сжатие`\PhpZip\Constants\ZipCompressionMethod::BZIP2` - Bzip2 сжатие при наличии расширения `ext-bz2`$zipFile->setCompressionMethodEntry($entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); ZipFile::setArchiveCommentУстанавливает комментарий к ZIP-архиву.$zipFile->setArchiveComment($commentArchive); ZipFile::setEntryCommentУстанавливает комментарий к записи, используя её имя.$zipFile->setEntryComment($entryName, $comment); ZipFile::matcherВыборка записей в архиве для проведения операций над выбранными записями.$matcher = $zipFile->matcher(); Выбор файлов из архива по одному:$matcher ->add('entry name') ->add('another entry'); Выбор нескольких файлов в архиве:$matcher->add([ 'entry name', 'another entry name', 'path/' ]); Выбор файлов по регулярному выражению:$matcher->match('~\.jpe?g$~i'); Выбор всех файлов в архиве:$matcher->all(); count() - получает количество выбранных записей:$count = count($matcher); // или $count = $matcher->count(); getMatches() - получает список выбранных записей:$entries = $matcher->getMatches(); // пример содержимого: ['entry name', 'another entry name']; invoke() - выполняет пользовательскую функцию над выбранными записями:// пример $matcher->invoke(function($entryName) use($zipFile) { $newName = preg_replace('~\.(jpe?g)$~i', '.no_optimize.$1', $entryName); $zipFile->rename($entryName, $newName); }); Функции для работы над выбранными записями:$matcher->delete(); // удалет выбранные записи из ZIP-архива $matcher->setPassword($password); // устанавливает новый пароль на выбранные записи $matcher->setPassword($password, $encryptionMethod); // устанавливает новый пароль и метод шифрования на выбранные записи $matcher->setEncryptionMethod($encryptionMethod); // устанавливает метод шифрования на выбранные записи $matcher->disableEncryption(); // отключает шифрование для выбранных записей Работа с паролямиРеализована поддержка методов шифрования:`\PhpZip\Constants\ZipEncryptionMethod::PKWARE` - Traditional PKWARE encryption`\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_256` - WinZip AES encryption 256 bit (рекомендуемое)`\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_192` - WinZip AES encryption 192 bit`\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_128` - WinZip AES encryption 128 bitZipFile::setReadPasswordУстанавливает пароль на чтение открытого запароленного архива для всех зашифрованных записей._Установка пароля не является обязательной для добавления новых записей или удаления существующих, но если вы захотите извлечь контент или изменить метод/уровень сжатия, метод шифрования или изменить пароль, то в этом случае пароль необходимо указать._$zipFile->setReadPassword($password); ZipFile::setReadPasswordEntryУстанавливает пароль на чтение конкретной зашифрованной записи открытого запароленного архива.$zipFile->setReadPasswordEntry($entryName, $password); ZipFile::setPasswordУстанавливает новый пароль для всех файлов, находящихся в архиве._Обратите внимание, что действие данного метода не распространяется на записи, добавленные после выполнения этого метода._$zipFile->setPassword($password); Можно установить метод шифрования:$encryptionMethod = \PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_256; $zipFile->setPassword($password, $encryptionMethod); ZipFile::setPasswordEntryУстанавливает новый пароль для конкретного файла.$zipFile->setPasswordEntry($entryName, $password); Можно установить метод шифрования:$encryptionMethod = \PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_256; $zipFile->setPasswordEntry($entryName, $password, $encryptionMethod); ZipFile::disableEncryptionОтключает шифрования всех записей, находящихся в архиве._Обратите внимание, что действие данного метода не распространяется на записи, добавленные после выполнения этого метода._$zipFile->disableEncryption(); ZipFile::disableEncryptionEntryОтключает шифрование записи по её имени.$zipFile->disableEncryptionEntry($entryName); Отмена измененийZipFile::unchangeAllОтменяет все изменения, сделанные в архиве.$zipFile->unchangeAll(); ZipFile::unchangeArchiveCommentОтменяет изменения в комментарии к архиву.$zipFile->unchangeArchiveComment(); ZipFile::unchangeEntryОтменяет изменения для конкретной записи архива.$zipFile->unchangeEntry($entryName); Сохранение файла или вывод в браузерZipFile::saveAsFileСохраняет архив в файл.$zipFile->saveAsFile($filename); ZipFile::saveAsStreamЗаписывает архив в поток.// $fp = fopen($filename, 'w+b'); $zipFile->saveAsStream($fp); ZipFile::outputAsStringВыводит ZIP-архив в виде строки.$rawZipArchiveBytes = $zipFile->outputAsString(); ZipFile::outputAsAttachmentВыводит ZIP-архив в браузер.При выводе устанавливаются необходимые заголовки, а после вывода завершается работа скрипта.$zipFile->outputAsAttachment($outputFilename); Можно установить MIME-тип:$mimeType = 'application/zip'; $zipFile->outputAsAttachment($outputFilename, $mimeType); ZipFile::outputAsPsr7ResponseВыводит ZIP-архив, как PSR-7 Response.Метод вывода может использоваться в любом PSR-7 совместимом фреймворке. // $response = ....; // instance Psr\Http\Message\ResponseInterface $zipFile->outputAsPsr7Response($response, $outputFilename); Можно установить MIME-тип:$mimeType = 'application/zip'; $zipFile->outputAsPsr7Response($response, $outputFilename, $mimeType); ZipFile::outputAsSymfonyResponseВыводит ZIP-архив, как Symfony Response.Метод вывода можно использовать в фреймворке Symfony.$response = $zipFile->outputAsSymfonyResponse($outputFilename); Вы можете установить Mime-Type:$mimeType = 'application/zip'; $response = $zipFile->outputAsSymfonyResponse($outputFilename, $mimeType); Пример использования в Symfony Controller:<?php namespace App\Controller; use PhpZip\ZipFile; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class DownloadZipController { /** * @Route("/downloads/{id}") * * @throws \PhpZip\Exception\ZipException */ public function __invoke(string $id): Response { $zipFile = new ZipFile(); $zipFile['file'] = 'contents'; $outputFilename = $id . '.zip'; return $zipFile->outputAsSymfonyResponse($outputFilename); } } ZipFile::rewriteСохраняет изменения и заново открывает изменившийся архив.$zipFile->rewrite(); Закрытие архиваZipFile::closeЗакрывает ZIP-архив.$zipFile->close(); Запуск тестовУстановите зависимости для разработки.composer install --dev Запустите тесты:vendor/bin/phpunit -v -c phpunit.xml История измененийИстория изменений на странице релизов.Обновление версийОбновление с версии 3 до версии 4Обновите мажорную версию в файле `composer.json` до `^4.0`.{ "require": { "nelexa/zip": "^4.0" } } Затем установите обновления с помощью `Composer`:composer update nelexa/zip Обновите ваш код для работы с новой версией:удалены устаревшие метродыудалён zipalign функционал (он будет помещен в отдельный пакет nelexa/apkfile)Обновление с версии 2 до версии 3Обновите мажорную версию в файле `composer.json` до `^3.0`.{ "require": { "nelexa/zip": "^3.0" } } Затем установите обновления с помощью `Composer`:composer update nelexa/zip Обновите ваш код для работы с новой версией:Класс `ZipOutputFile` объединён с `ZipFile` и удалён. + Замените `new \PhpZip\ZipOutputFile()` на `new \PhpZip\ZipFile()`Статичиская инициализация методов стала не статической. + Замените `\PhpZip\ZipFile::openFromFile($filename);` на `(new \PhpZip\ZipFile())->openFile($filename);` + Замените `\PhpZip\ZipOutputFile::openFromFile($filename);` на `(new \PhpZip\ZipFile())->openFile($filename);` + Замените `\PhpZip\ZipFile::openFromString($contents);` на `(new \PhpZip\ZipFile())->openFromString($contents);` + Замените `\PhpZip\ZipFile::openFromStream($stream);` на `(new \PhpZip\ZipFile())->openFromStream($stream);` + Замените `\PhpZip\ZipOutputFile::create()` на `new \PhpZip\ZipFile()` + Замените `\PhpZip\ZipOutputFile::openFromZipFile($zipFile)` на `(new \PhpZip\ZipFile())->openFile($filename);`Переименуйте методы: + `addFromFile` в `addFile` + `setLevel` в `setCompressionLevel` + `ZipFile::setPassword` в `ZipFile::withReadPassword` + `ZipOutputFile::setPassword` в `ZipFile::withNewPassword` + `ZipOutputFile::disableEncryptionAllEntries` в `ZipFile::withoutPassword` + `ZipOutputFile::setComment` в `ZipFile::setArchiveComment` + `ZipFile::getComment` в `ZipFile::getArchiveComment`Изменились сигнатуры для методов `addDir`, `addFilesFromGlob`, `addFilesFromRegex`.Удалены методы: + `getLevel` + `setCompressionMethod` + `setEntryPassword`

发表评论 取消回复