nelexa / zip
PhpZip 是一个用于扩展ZIP归档工作的 php 库。打开、创建、更新、删除、提取和获取信息工具。支持向现有 ZIP 文件追加、WinZip AES 加密、传统 PKWARE 加密、BZIP2 压缩、外部文件属性和 ZIP64 扩展。替代 ZipArchi
Requires
- php: ^7.4 || ^8.0
- ext-zlib: *
- psr/http-message: *
- symfony/finder: *
Requires (Dev)
- ext-bz2: *
- ext-dom: *
- ext-fileinfo: *
- ext-iconv: *
- ext-openssl: *
- ext-xml: *
- friendsofphp/php-cs-fixer: ^3.4.0
- guzzlehttp/psr7: ^1.6
- phpunit/phpunit: ^9
- symfony/http-foundation: *
- symfony/var-dumper: *
- vimeo/psalm: ^4.6
Suggests
- ext-bz2: Needed to support BZIP2 compression
- ext-fileinfo: Needed to get mime-type file
- ext-iconv: Needed to support convert zip entry name to requested character encoding
- ext-openssl: Needed to support encrypt zip entries or use ext-mcrypt
- dev-master
- 4.0.2
- 4.0.1
- 4.0.0
- 3.3.3
- 3.3.2
- 3.3.1
- 3.3.0
- 3.3.0-alpha1
- 3.2.2
- 3.2.1
- 3.2.0
- 3.1.15
- 3.1.14
- 3.1.13
- 3.1.12
- 3.1.11
- 3.1.10
- 3.1.9
- 3.1.8
- 3.1.7
- 3.1.6
- 3.1.5
- 3.1.4
- 3.1.3
- 3.1.2
- 3.1.1
- 3.1.0
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.2.0
- 2.1.1
- 2.1.0
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.0.0
- dev-develop
- dev-support/3.4.x
- dev-support/3.3.x
- dev-support/3.2.x
- dev-support/3.1.x
This package is auto-updated.
Last update: 2024-09-22 03:02:06 UTC
README
PhpZip
是一个用于扩展ZIP归档工作的 php 库。
版本和依赖关系
目录
功能
- 打开和解压缩 ZIP 文件。
- 创建 ZIP 归档。
- 修改 ZIP 归档。
- 纯 php(不需要扩展
php-zip
和类\ZipArchive
)。 - 它支持将归档保存到文件、输出到浏览器,或以字符串形式输出而不保存到文件。
- 支持归档注释和单个条目的注释。
- 获取归档中每个条目的信息。
- 仅支持以下压缩方法
- 不压缩(存储)。
- Deflate 压缩。
- 使用
php-bz2
扩展的 BZIP2 压缩。
- 支持
ZIP64
(文件大小超过 4 GB 或归档中的条目数超过 65535)。 - 处理密码
注意!
对于 32 位系统,目前不支持传统的 PKWARE 加密(ZipCrypto)加密方法。尽可能使用
WinZIP AES 加密
方法。- 为所有条目或仅某些条目设置读取归档的密码。
- 更改归档的密码,包括单个条目的密码。
- 删除所有或单个条目的归档密码。
- 为所有和归档中的单个条目设置密码和/或加密方法。
- 为不同的条目设置不同的密码和加密方法。
- 删除所有或某些条目的密码。
- 支持
传统 PKWARE 加密(ZipCrypto)
和WinZIP AES 加密
加密方法。 - 为归档中的所有或单个条目设置加密方法。
要求
PHP
>= 7.4 或PHP
>= 8.0(最好是 64 位)。- 可选 php 扩展
bzip2
用于 BZIP2 压缩。 - 可选 php 扩展
openssl
用于WinZIP AES 加密
支持。
安装
composer require nelexa/zip
示例
// create new archive $zipFile = new \PhpZip\ZipFile(); try{ $zipFile ->addFromString('zip/entry/filename', 'Is file content') // add an entry from the string ->addFile('/path/to/file', 'data/tofile') // add an entry from the file ->addDir(__DIR__, 'to/path/') // add files from the directory ->saveAsFile($outputFilename) // save the archive to a file ->close(); // close archive // open archive, extract, add files, set password and output to browser. $zipFile ->openFile($outputFilename) // open archive from file ->extractTo($outputDirExtract) // extract files to the specified directory ->deleteFromRegex('~^\.~') // delete all hidden (Unix) files ->addFromString('dir/file.txt', 'Test file') // add a new entry from the string ->setPassword('password') // set password for all entries ->outputAsAttachment('library.jar'); // output to the browser without saving to a file } catch(\PhpZip\Exception\ZipException $e){ // handle exception } finally{ $zipFile->close(); }
其他示例可以在 tests/
文件夹中找到
术语表
ZIP条目 - ZIP归档中的文件或文件夹。归档中的每个条目都有某些属性,例如:文件名、压缩方法、加密方法、压缩前文件大小、压缩后文件大小、CRC32等。
文档
\PhpZip\ZipFile
类方法的概述
- ZipFile::__construct - 初始化ZIP归档。
- ZipFile::addAll - 从数组中添加所有条目。
- ZipFile::addDir - 从指定路径的目录中添加文件到归档,不包括子目录。
- ZipFile::addDirRecursive - 从指定路径的目录中添加文件到归档,包括子目录。
- ZipFile::addEmptyDir - 添加一个新目录。
- ZipFile::addFile - 从给定路径将文件添加到ZIP归档。
- ZipFile::addSplFile - 将一个
\SplFileInfo
添加到ZIP归档。 - ZipFile::addFromFinder - 从
Symfony\Component\Finder\Finder
中添加文件到ZIP归档。 - ZipFile::addFilesFromIterator - 从目录的迭代器中添加文件。
- ZipFile::addFilesFromGlob - 通过glob模式从目录添加文件,不包括子目录。
- ZipFile::addFilesFromGlobRecursive - 通过glob模式从目录添加文件,包括子目录。
- ZipFile::addFilesFromRegex - 通过PCRE模式从目录添加文件,不包括子目录。
- ZipFile::addFilesFromRegexRecursive - 通过PCRE模式从目录添加文件,包括子目录。
- ZipFile::addFromStream - 从流中添加条目到ZIP归档。
- ZipFile::addFromString - 使用文件内容将其添加到ZIP归档。
- ZipFile::close - 关闭归档。
- ZipFile::count - 返回归档中的条目数。
- ZipFile::deleteFromName - 使用名称从归档中删除条目。
- ZipFile::deleteFromGlob - 使用glob模式从归档中删除条目。
- ZipFile::deleteFromRegex - 使用PCRE模式从归档中删除条目。
- 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响应输出。
- ZipFile::outputAsSymfonyResponse - 将ZIP存档作为Symfony响应输出。
- 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); // or $count = $zipFile->count();
ZipFile::getListFiles
返回存档文件列表。
$zipFile = new \PhpZip\ZipFile(); $listFiles = $zipFile->getListFiles(); // example array contents: // array ( // 0 => 'info.txt', // 1 => 'path/to/file.jpg', // 2 => 'another path/', // 3 => '0', // )
ZipFile::getEntryContent
使用名称返回条目内容。
// $entryName = 'path/to/example-entry-name.txt'; $zipFile = new \PhpZip\ZipFile(); $contents = $zipFile[$entryName]; // or $contents = $zipFile->getEntryContents($entryName);
ZipFile::hasEntry
检查存档中是否存在条目。
// $entryName = 'path/to/example-entry-name.txt'; $zipFile = new \PhpZip\ZipFile(); $hasEntry = isset($zipFile[$entryName]); // or $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);
将某些文件提取到目录中。目录必须存在。
// $toDirectory = '/tmp'; $extractOnlyFiles = [ 'filename1', 'filename2', 'dir/dir/dir/' ]; $zipFile = new \PhpZip\ZipFile(); $zipFile->extractTo($toDirectory, $extractOnlyFiles);
迭代条目
ZipFile
是一个迭代器。可以在 foreach
循环中遍历所有条目。
foreach($zipFile as $entryName => $contents){ echo "Filename: $entryName" . PHP_EOL; echo "Contents: $contents" . PHP_EOL; echo '-----------------------------' . PHP_EOL; }
可以遍历 Iterator
。
$iterator = new \ArrayIterator($zipFile); while ($iterator->valid()) { $entryName = $iterator->key(); $contents = $iterator->current(); echo "Filename: $entryName" . PHP_EOL; echo "Contents: $contents" . PHP_EOL; echo '-----------------------------' . PHP_EOL; $iterator->next(); }
获取条目的信息
ZipFile::getArchiveComment
返回Zip存档注释。
$zipFile = new \PhpZip\ZipFile(); $commentArchive = $zipFile->getArchiveComment();
ZipFile::getEntryComment
使用条目名称返回注释。
$zipFile = new \PhpZip\ZipFile(); $commentEntry = $zipFile->getEntryComment($entryName);
向归档中添加条目
所有将条目添加到ZIP存档的方法都允许您指定压缩内容的方法。
以下压缩方法可用
\PhpZip\Constants\ZipCompressionMethod::STORED
- 无压缩\PhpZip\Constants\ZipCompressionMethod::DEFLATED
- Deflate压缩\PhpZip\Constants\ZipCompressionMethod::BZIP2
- 使用扩展ext-bz2
的Bzip2压缩
ZipFile::addFile
从给定路径将文件添加到ZIP存档。
$zipFile = new \PhpZip\ZipFile(); // $file = '...../file.ext'; // $entryName = 'file2.ext' $zipFile->addFile($file); // you can specify the name of the entry in the archive (if null, then the last component from the file name is used) $zipFile->addFile($file, $entryName); // you can specify a compression method $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addFile($file, $entryName, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
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); // set compression method $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; // or $zipFile->addFromString($entryName, $contents); // you can specify a compression method $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addFromString($entryName, $contents, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
ZipFile::addFromStream
从流中添加条目到ZIP存档。
$zipFile = new \PhpZip\ZipFile(); // $stream = fopen(..., 'rb'); $zipFile->addFromStream($stream, $entryName); // or $zipFile[$entryName] = $stream; // you can specify a compression method $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addFromStream($stream, $entryName, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
ZipFile::addEmptyDir
添加新目录。
$zipFile = new \PhpZip\ZipFile(); // $path = "path/to/"; $zipFile->addEmptyDir($path); // or $zipFile[$path] = null;
ZipFile::addAll
从数组添加所有条目。
$entries = [ 'file.txt' => 'file contents', // add an entry from the string contents 'empty dir/' => null, // add empty directory 'path/to/file.jpg' => fopen('..../filename', 'rb'), // add an entry from the stream 'path/to/file.dat' => new \SplFileInfo('..../filename'), // add an entry from the file ]; $zipFile = new \PhpZip\ZipFile(); $zipFile->addAll($entries);
ZipFile::addDir
从指定路径上的目录添加文件到存档,不包括子目录。
$zipFile = new \PhpZip\ZipFile(); $zipFile->addDir($dirName); // you can specify the path in the archive to which you want to put entries $localPath = 'to/path/'; $zipFile->addDir($dirName, $localPath); // you can specify a compression method $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addDir($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
ZipFile::addDirRecursive
从指定路径上的目录添加文件到存档,包括子目录。
$zipFile = new \PhpZip\ZipFile(); $zipFile->addDirRecursive($dirName); // you can specify the path in the archive to which you want to put entries $localPath = 'to/path/'; $zipFile->addDirRecursive($dirName, $localPath); // you can specify a compression method $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addDirRecursive($dirName, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
ZipFile::addFilesFromIterator
从目录迭代器添加文件。
// $directoryIterator = new \DirectoryIterator($dir); // without subdirectories // $directoryIterator = new \RecursiveDirectoryIterator($dir); // with subdirectories $zipFile = new \PhpZip\ZipFile(); $zipFile->addFilesFromIterator($directoryIterator); // you can specify the path in the archive to which you want to put entries $localPath = 'to/path/'; $zipFile->addFilesFromIterator($directoryIterator, $localPath); // or $zipFile[$localPath] = $directoryIterator; // you can specify a compression method $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addFilesFromIterator($directoryIterator, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
包含忽略某些文件示例
$ignoreFiles = [ 'file_ignore.txt', 'dir_ignore/sub dir ignore/' ]; // $directoryIterator = new \DirectoryIterator($dir); // without subdirectories // $directoryIterator = new \RecursiveDirectoryIterator($dir); // with subdirectories // use \PhpZip\Util\Iterator\IgnoreFilesFilterIterator for non-recursive search $zipFile = new \PhpZip\ZipFile(); $ignoreIterator = new \PhpZip\Util\Iterator\IgnoreFilesRecursiveFilterIterator( $directoryIterator, $ignoreFiles ); $zipFile->addFilesFromIterator($ignoreIterator);
ZipFile::addFilesFromGlob
通过 glob模式 从目录添加文件,不包括子目录。
$globPattern = '**.{jpg,jpeg,png,gif}'; // example glob pattern -> add all .jpg, .jpeg, .png and .gif files $zipFile = new \PhpZip\ZipFile(); $zipFile->addFilesFromGlob($dir, $globPattern); // you can specify the path in the archive to which you want to put entries $localPath = 'to/path/'; $zipFile->addFilesFromGlob($dir, $globPattern, $localPath); // you can specify a compression method $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addFilesFromGlob($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
ZipFile::addFilesFromGlobRecursive
通过 glob模式 从目录添加文件,包括子目录。
$globPattern = '**.{jpg,jpeg,png,gif}'; // example glob pattern -> add all .jpg, .jpeg, .png and .gif files $zipFile = new \PhpZip\ZipFile(); $zipFile->addFilesFromGlobRecursive($dir, $globPattern); // you can specify the path in the archive to which you want to put entries $localPath = 'to/path/'; $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath); // you can specify a compression method $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addFilesFromGlobRecursive($dir, $globPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
ZipFile::addFilesFromRegex
通过 PCRE模式 从目录添加文件,不包括子目录。
$regexPattern = '/\.(jpe?g|png|gif)$/si'; // example regex pattern -> add all .jpg, .jpeg, .png and .gif files $zipFile = new \PhpZip\ZipFile(); $zipFile->addFilesFromRegex($dir, $regexPattern); // you can specify the path in the archive to which you want to put entries $localPath = 'to/path/'; $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath); // you can specify a compression method $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addFilesFromRegex($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
ZipFile::addFilesFromRegexRecursive
通过 PCRE模式 从目录添加文件,包括子目录。
$regexPattern = '/\.(jpe?g|png|gif)$/si'; // example regex pattern -> add all .jpg, .jpeg, .png and .gif files $zipFile->addFilesFromRegexRecursive($dir, $regexPattern); // you can specify the path in the archive to which you want to put entries $localPath = 'to/path/'; $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath); // you can specify a compression method $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::STORED); // No compression $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::DEFLATED); // Deflate compression $zipFile->addFilesFromRegexRecursive($dir, $regexPattern, $localPath, \PhpZip\Constants\ZipCompressionMethod::BZIP2); // BZIP2 compression
从归档中删除条目
ZipFile::deleteFromName
使用名称删除存档中的条目。
$zipFile = new \PhpZip\ZipFile(); $zipFile->deleteFromName($entryName);
ZipFile::deleteFromGlob
使用 glob模式 删除存档中的条目。
$globPattern = '**.{jpg,jpeg,png,gif}'; // example glob pattern -> delete all .jpg, .jpeg, .png and .gif files $zipFile = new \PhpZip\ZipFile(); $zipFile->deleteFromGlob($globPattern);
ZipFile::deleteFromRegex
使用 PCRE模式 删除存档中的条目。
$regexPattern = '/\.(jpe?g|png|gif)$/si'; // example regex pattern -> delete all .jpg, .jpeg, .png and .gif files $zipFile = new \PhpZip\ZipFile(); $zipFile->deleteFromRegex($regexPattern);
ZipFile::deleteAll
删除ZIP存档中的所有条目。
$zipFile = new \PhpZip\ZipFile(); $zipFile->deleteAll();
处理条目和归档
ZipFile::rename
重命名由名称定义的条目。
$zipFile = new \PhpZip\ZipFile(); $zipFile->rename($oldName, $newName);
ZipFile::setCompressionLevel
为存档中的所有文件设置压缩级别。
请注意,此方法不适用于运行该方法后添加的条目。
默认情况下,压缩级别为5(\PhpZip\Constants\ZipCompressionLevel::NORMAL
)或归档中指定的Deflate压缩级别。
支持的范围从1(\PhpZip\Constants\ZipCompressionLevel::SUPER_FAST
)到9(\PhpZip\Constants\ZipCompressionLevel::MAXIMUM
)。数字越高,压缩效果越好,耗时也越长。
$zipFile = new \PhpZip\ZipFile(); $zipFile->setCompressionLevel(\PhpZip\Constants\ZipCompressionLevel::MAXIMUM);
ZipFile::setCompressionLevelEntry
通过名称设置条目的压缩级别。
支持的范围从1(\PhpZip\Constants\ZipCompressionLevel::SUPER_FAST
)到9(\PhpZip\Constants\ZipCompressionLevel::MAXIMUM
)。数字越高,压缩效果越好,耗时也越长。
$zipFile = new \PhpZip\ZipFile(); $zipFile->setCompressionLevelEntry($entryName, \PhpZip\Constants\ZipCompressionLevel::FAST);
ZipFile::setCompressionMethodEntry
通过名称设置条目的压缩方法。
以下压缩方法可用
\PhpZip\Constants\ZipCompressionMethod::STORED
- 不压缩\PhpZip\Constants\ZipCompressionMethod::DEFLATED
- Deflate压缩\PhpZip\Constants\ZipCompressionMethod::BZIP2
- 使用扩展ext-bz2
的Bzip2压缩
$zipFile = new \PhpZip\ZipFile(); $zipFile->setCompressionMethodEntry($entryName, \PhpZip\Constants\ZipCompressionMethod::DEFLATED);
ZipFile::setArchiveComment
设置ZIP归档的注释。
$zipFile = new \PhpZip\ZipFile(); $zipFile->setArchiveComment($commentArchive);
ZipFile::setEntryComment
设置通过名称定义的条目的注释。
$zipFile = new \PhpZip\ZipFile(); $zipFile->setEntryComment($entryName, $comment);
ZipFile::matcher
选择归档中的条目以对它们执行操作。
$zipFile = new \PhpZip\ZipFile(); $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); // or $count = $matcher->count();
getMatches() - 返回所选条目的列表
$entries = $matcher->getMatches(); // example array contents: ['entry name', 'another entry name'];
invoke() - 在所选条目上调用可调用的函数
// example $matcher->invoke(static function($entryName) use($zipFile) { $newName = preg_replace('~\.(jpe?g)$~i', '.no_optimize.$1', $entryName); $zipFile->rename($entryName, $newName); });
处理所选条目的函数
$matcher->delete(); // remove selected entries from a ZIP archive $matcher->setPassword($password); // sets a new password for the selected entries $matcher->setPassword($password, $encryptionMethod); // sets a new password and encryption method to selected entries $matcher->setEncryptionMethod($encryptionMethod); // sets the encryption method to the selected entries $matcher->disableEncryption(); // disables encryption for selected entries
处理密码
实现了加密方法的支持
\PhpZip\Constants\ZipEncryptionMethod::PKWARE
- 传统PKWARE加密(已过时)\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_256
- WinZip AES加密256位(推荐)\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_192
- WinZip AES加密192位\PhpZip\Constants\ZipEncryptionMethod::WINZIP_AES_128
- WinZip AES加密128位
ZipFile::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-Type
$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-Type
$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控制器中的示例使用
<?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
关闭归档。
$zipFile->close();
运行测试
安装开发所需的依赖项
composer install --dev
运行测试
vendor/bin/phpunit
变更日志
更改记录在发布页面中。
升级
将版本 3 升级到版本 4
将文件composer.json
中的主版本号更新为^4.0
。
{ "require": { "nelexa/zip": "^4.0" } }
然后使用Composer
安装更新
composer update nelexa/zip
更新您的代码以与新版本兼容:BC
- 删除了已弃用的类和方法。
- 删除了
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(\PhpZip\ZipFile $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