Pisarev Alexey ef51e04872 Merge pull request #80 from th-otto/PR-1 | 2 周之前 | |
---|---|---|
.github | 3 年之前 | |
src | 2 周之前 | |
tests | 3 年之前 | |
.gitattributes | 3 年之前 | |
.gitignore | 3 年之前 | |
.php-cs-fixer.php | 3 年之前 | |
.phpstorm.meta.php | 3 年之前 | |
LICENSE | 4 年之前 | |
README.RU.md | 3 年之前 | |
README.md | 3 年之前 | |
bootstrap.php | 3 年之前 | |
composer.json | 3 年之前 | |
logo.svg | 3 年之前 | |
phpunit.xml | 3 年之前 | |
psalm.xml.dist | 3 年之前 |
PhpZip
- php библиотека для продвинутой работы с ZIP-архивами.
\PhpZip\ZipFile
php-zip
и класс \ZipArchive
).php-bz2
.ZIP64
(размер файла более 4 GB или количество записей в архиве более 65535).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).bzip2
для поддержки BZIP2 компрессии.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
\SplFileInfo
в zip-архив.Symfony\Component\Finder\Finder
в zip архив.Инициализирует ZIP-архив.
$zipFile = new \PhpZip\ZipFile();
Открывает ZIP-архив из файла.
$zipFile = new \PhpZip\ZipFile();
$zipFile->openFile('file.zip');
Открывает ZIP-архив из строки.
$zipFile = new \PhpZip\ZipFile();
$zipFile->openFromString($stringContents);
Открывает ZIP-архив из потока.
$stream = fopen('file.zip', 'rb');
$zipFile = new \PhpZip\ZipFile();
$zipFile->openFromStream($stream);
Возвращает количество записей в архиве.
$zipFile = new \PhpZip\ZipFile();
$count = count($zipFile);
// или
$count = $zipFile->count();
Возвращает список файлов архива.
$zipFile = new \PhpZip\ZipFile();
$listFiles = $zipFile->getListFiles();
// Пример содержимого массива:
// array (
// 0 => 'info.txt',
// 1 => 'path/to/file.jpg',
// 2 => 'another path/',
// )
Возвращает содержимое записи.
// $entryName = 'path/to/example-entry-name.txt';
$zipFile = new \PhpZip\ZipFile();
$contents = $zipFile[$entryName];
// или
$contents = $zipFile->getEntryContents($entryName);
Проверяет, присутствует ли запись в архиве.
// $entryName = 'path/to/example-entry-name.txt';
$zipFile = new \PhpZip\ZipFile();
$hasEntry = isset($zipFile[$entryName]);
// или
$hasEntry = $zipFile->hasEntry($entryName);
Проверяет, является ли запись в архиве директорией.
// $entryName = 'path/to/';
$zipFile = new \PhpZip\ZipFile();
$isDirectory = $zipFile->isDirectory($entryName);
Извлекает содержимое архива в заданную директорию. Директория должна существовать.
$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();
}
Возвращает комментарий ZIP-архива.
$commentArchive = $zipFile->getArchiveComment();
Возвращает комментарий к записи, используя её имя.
$commentEntry = $zipFile->getEntryComment($entryName);
Все методы добавления записей в ZIP-архив позволяют указать метод сжатия содержимого.
Доступны следующие методы сжатия:
\PhpZip\Constants\ZipCompressionMethod::STORED
- без сжатия\PhpZip\Constants\ZipCompressionMethod::DEFLATED
- Deflate сжатие\PhpZip\Constants\ZipCompressionMethod::BZIP2
- Bzip2 сжатие при наличии расширения ext-bz2
Добавляет в 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 сжатие
Добавляет объект \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,
]);
Добавляет файлы из 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')
]);
Добавляет файл в 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 сжатие
Добавляет в 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 сжатие
Добавляет в ZIP-архив новую (пустую) директорию.
// $path = "path/to/";
$zipFile->addEmptyDir($path);
// или
$zipFile[$path] = null;
Добавляет все записи из массива.
$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($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 сжатие
Добавляет файлы из директории по указанному пути 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 сжатие
Добавляет файлы из итератора директорий.
// $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);
Добавляет файлы из директории в соответствии с 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 сжатие
Добавляет файлы из директории в соответствии с 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 сжатие
Добавляет файлы из директории в соответствии с регулярным выражением без вложенных директорий.
$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 сжатие
Добавляет файлы из директории в соответствии с регулярным выражением с вложенными директориями.
$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($entryName);
Удаляет записи в соответствии с glob шаблоном.
$globPattern = '**.{jpg,jpeg,png,gif}'; // пример glob шаблона -> удалить все .jpg, .jpeg, .png и .gif файлы
$zipFile->deleteFromGlob($globPattern);
Удаляет записи в соответствии с регулярным выражением.
$regexPattern = '/\.(jpe?g|png|gif)$/si'; // пример регулярному выражения -> удалить все .jpg, .jpeg, .png и .gif файлы
$zipFile->deleteFromRegex($regexPattern);
Удаляет все записи в ZIP-архиве.
$zipFile->deleteAll();
Переименовывает запись по имени.
$zipFile->rename($oldName, $newName);
Устанавливает уровень сжатия для всех файлов, находящихся в архиве.
Обратите внимание, что действие данного метода не распространяется на записи, добавленные после выполнения этого метода.
По умолчанию используется уровень сжатия 5 (\PhpZip\Constants\ZipCompressionLevel::NORMAL
) или уровень сжатия, определённый в архиве для Deflate сжатия.
Поддерживаются диапазон значений от 1 (\PhpZip\Constants\ZipCompressionLevel::SUPER_FAST
) до 9 (\PhpZip\Constants\ZipCompressionLevel::MAXIMUM
). Чем выше число, тем лучше и дольше сжатие.
$zipFile->setCompressionLevel(\PhpZip\Constants\ZipCompressionLevel::MAXIMUM);
Устанавливает уровень сжатия для определённой записи в архиве.
Поддерживаются диапазон значений от 1 (\PhpZip\Constants\ZipCompressionLevel::SUPER_FAST
) до 9 (\PhpZip\Constants\ZipCompressionLevel::MAXIMUM
). Чем выше число, тем лучше и дольше сжатие.
$zipFile->setCompressionLevelEntry($entryName, \PhpZip\Constants\ZipCompressionLevel::MAXIMUM);
Устанавливает метод сжатия для определённой записи в архиве.
Доступны следующие методы сжатия:
\PhpZip\Constants\ZipCompressionMethod::STORED
- без сжатия\PhpZip\Constants\ZipCompressionMethod::DEFLATED
- Deflate сжатие\PhpZip\Constants\ZipCompressionMethod::BZIP2
- Bzip2 сжатие при наличии расширения ext-bz2
$zipFile->setCompressionMethodEntry($entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED);
Устанавливает комментарий к ZIP-архиву.
$zipFile->setArchiveComment($commentArchive);
Устанавливает комментарий к записи, используя её имя.
$zipFile->setEntryComment($entryName, $comment);
Выборка записей в архиве для проведения операций над выбранными записями.
$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 bitУстанавливает пароль на чтение открытого запароленного архива для всех зашифрованных записей.
Установка пароля не является обязательной для добавления новых записей или удаления существующих, но если вы захотите извлечь контент или изменить метод/уровень сжатия, метод шифрования или изменить пароль, то в этом случае пароль необходимо указать.
$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);
Выводит 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);
Выводит 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();
Закрывает ZIP-архив.
$zipFile->close();
Установите зависимости для разработки.
composer install --dev
Запустите тесты:
vendor/bin/phpunit -v -c phpunit.xml
История изменений на странице релизов.
Обновите мажорную версию в файле composer.json
до ^4.0
.
{
"require": {
"nelexa/zip": "^4.0"
}
}
Затем установите обновления с помощью Composer
:
composer update nelexa/zip
Обновите ваш код для работы с новой версией:
удалён zipalign функционал (он будет помещен в отдельный пакет nelexa/apkfile)
Обновите мажорную версию в файле 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