PHP中ZIP归档操作:ZipArchive完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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();?>


从归档中删除文件

删除特定

推荐