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

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

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

开始课程

PHP中ZIP归档操作简介



数据归档是Web开发的基本任务之一。无论是数据库备份、打包用户上传的文件,还是导出大量信息,ZIP格式始终是最流行且通用的解决方案。PHP提供了内置的ZipArchive类,无需安装额外扩展即可执行所有主要的ZIP归档操作。



本文将详细介绍如何在PHP中使用ZipArchive:从创建简单的归档到处理嵌套文件夹和密码保护。所有代码示例均可直接在您的服务器上使用。



准备工作:检查Zip扩展



在开始之前,请确保您的服务器已启用zip扩展。在现代PHP版本(7.4+、8.x)中,它通常默认安装。您可以通过phpinfo()函数或一个简单的脚本来检查:



<?phpif (extension_loaded('zip')) {    echo 'Zip扩展可用';} else {    echo '未找到Zip扩展。请通过php.ini安装它';}?>


在PHP中创建ZIP归档



步骤1. 初始化ZipArchive对象



首先,创建一个ZipArchive类的实例,并使用open()方法打开一个新归档。第二个参数——标志ZipArchive::CREATE——指示将重新创建归档(如果已存在则覆盖)。



<?php$zip = new ZipArchive();$zipName = 'example.zip';

if ($zip->open($zipName, ZipArchive::CREATE) !== TRUE) { exit("无法创建归档 $zipName");}?>


步骤2. 向归档中添加文件



addFile()方法从文件系统中添加现有文件。第一个参数是文件路径,第二个(可选)是归档内的文件名(如果您想重命名)。



<?php// 添加单个文件$zip->addFile('document.pdf', 'my_document.pdf');

// 添加多个文件$files = ['photo1.jpg', 'photo2.jpg', 'photo3.jpg'];foreach ($files as $file) { $zip->addFile($file);}?>


步骤3. 添加整个文件夹并保留结构



如果需要打包包含所有嵌套文件的目录,请使用递归遍历。这是一个现成的函数:



<?phpfunction addFolderToZip($zip, $folder, $parentFolder = '') {    $files = new RecursiveIteratorIterator(        new RecursiveDirectoryIterator($folder),        RecursiveIteratorIterator::LEAVES_ONLY    );

foreach ($files as $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = $parentFolder . $file->getFilename(); $zip->addFile($filePath, $relativePath); } }}

// 使用示例:$zip->addEmptyDir('my_folder'); // 在归档中创建文件夹addFolderToZip($zip, '/path/to/source_folder', 'my_folder/');?>


步骤4. 关闭归档



添加完所有文件后,务必关闭归档——否则数据将不会被写入。



<?php$zip->close();echo "归档 $zipName 已成功创建!";?>


在PHP中解压ZIP归档



使用extractTo()方法提取文件。指定目标文件夹,文件将被解压到该处。



<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) {    $zip->extractTo('/path/to/extract_folder/');    $zip->close();    echo '归档已成功解压';} else {    echo '打开归档时出错';}?>


ZipArchive的高级功能



将字符串作为文件添加



addFromString()方法允许直接从字符串创建文件

推荐