PHP中ZIP归档操作入门
创建和处理ZIP归档是Web开发中的常见任务之一。在PHP中,这项任务可以通过内置的Zip扩展来解决,它提供了强大且便捷的ZipArchive类。借助它,您可以创建新归档、解压现有归档、添加或删除文件,以及处理元数据。
本文将详细讲解PHP中ZIP归档的所有基本操作:从简单的创建到错误处理以及密码相关操作。所有示例均可直接用于您的项目。
准备工作:检查Zip扩展是否可用
在开始之前,请确保您的服务器上已安装并启用了zip扩展。您可以通过phpinfo()函数或一个简单的脚本来检查:
<?phpif (extension_loaded('zip')) { echo "Zip扩展可用";} else { echo "未找到Zip扩展";}?>如果扩展缺失,请通过操作系统的包管理器安装(例如,Ubuntu使用apt install php-zip),或在php.ini文件中启用它。
创建新的ZIP归档
创建归档最简单的方法是:以写入模式打开一个新文件,然后向其中添加文件。来看一个基本示例:
<?php$zip = new ZipArchive();$filename = 'example.zip';
// 创建新归档 (ZIPARCHIVE::CREATE)if ($zip->open($filename, ZipArchive::CREATE) === TRUE) { // 从本地文件系统添加文件 $zip->addFile('/path/to/file1.txt', 'file1.txt'); // 将字符串作为新文件添加到归档中 $zip->addFromString('hello.txt', '你好,世界!'); // 添加整个文件夹(递归) $zip->addGlob('/path/to/dir/*.*'); $zip->close(); echo "归档 $filename 创建成功";} else { echo "创建归档时出错";}?>请注意:addFile()的第二个参数是归档内的文件名。如果不指定,文件将保留其原始名称。
解压ZIP归档
使用extractTo()方法从归档中提取文件。指定目标文件夹,文件将被解压到该位置:
<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) { // 将所有文件解压到 'unpacked' 文件夹 $zip->extractTo('/path/to/unpacked/'); $zip->close(); echo "归档已解压";} else { echo "打开归档时出错";}?>如果只需要提取特定文件,可以将文件列表作为第三个参数传递:
$zip->extractTo('/path/to/unpacked/', ['file1.txt', 'hello.txt']);查看归档内容
有时需要在不解压的情况下获取归档内的文件列表。为此,可以使用ZipArchive的属性和方法:
<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) { echo "文件数量: " . $zip->numFiles . "<br>"; for ($i = 0; $i < $zip->numFiles; $i++) { $stat = $zip->statIndex($i); echo "文件: " . $stat['name'] . " (大小: " . $stat['size'] . " 字节)<br>"; } $zip->close();}?>添加文件并保留文件夹结构
要在添加时保留目录层级,请在归档内的文件名中使用相对路径:
<?php$zip = new ZipArchive();$zip->open('backup.zip', ZipArchive::CREATE);
// 添加文件并保留子文件夹$zip->addFile('/var/www/images/photo.jpg', 'images/photo.jpg');// 或递归添加整个文件夹$zip->addPattern('/\\.(jpg|png)$/', '/var/www/images/', ['add_path' => 'images/']);
$zip->close();?>从归档中删除文件
删除特定