在 PHP 中,压缩文件(特别是 .zip 格式)是一项常见的任务。PHP 提供了一个内置的扩展库 ZipArchive,该库用于创建、打开和修改 .zip 文件。通过 ZipArchive 类,您可以方便地实现对 ZIP 文件的压缩和解压。

本文将介绍如何使用 ZipArchive 来进行 PHP 文件压缩操作,详细讲解如何创建 .zip 文件、添加文件到 .zip 压缩包以及解压文件等常见操作。

1. 创建并写入 .zip 文件

使用 ZipArchive 类创建新的 .zip 文件并添加文件内容,可以按照以下步骤进行。

1.1 创建 .zip 文件并添加单个文件

<?php
// 创建 ZipArchive 对象
$zip = new ZipArchive();

// 指定压缩包文件路径
$zipFile = 'example.zip';

// 创建或打开压缩包
if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
    // 添加文件到压缩包
    $zip->addFile('file1.txt', 'file1.txt');  // 'file1.txt' 为原文件,'file1.txt' 为压缩包中的路径

    // 关闭压缩包
    $zip->close();
    echo '文件已成功压缩!';
} else {
    echo '无法创建压缩文件!';
}
?>

在上面的代码中,我们首先通过 ZipArchive::CREATE 模式打开压缩文件。如果压缩文件不存在,则会创建一个新的压缩文件。然后,我们通过 addFile() 方法将一个文件添加到压缩包中。最后,通过 close() 方法关闭并保存压缩包。

1.2 添加多个文件到 .zip 压缩包

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

if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
    // 添加多个文件
    $zip->addFile('file1.txt', 'file1.txt');
    $zip->addFile('file2.txt', 'file2.txt');
    $zip->addFile('file3.txt', 'file3.txt');

    // 关闭压缩包
    $zip->close();
    echo '多个文件已成功压缩!';
} else {
    echo '无法创建压缩文件!';
}
?>

你可以通过多次调用 addFile() 方法将多个文件添加到 .zip 文件中,确保将文件名和路径指定正确。

1.3 添加整个目录到 .zip 压缩包

如果要将一个文件夹及其内容递归地添加到 .zip 文件中,可以使用 addGlob()addFile() 方法结合递归操作。

<?php
function addFolderToZip($zip, $folderPath, $parentFolder = '') {
    $folderContents = scandir($folderPath);
    
    foreach ($folderContents as $content) {
        // 忽略 . 和 .. 文件夹
        if ($content == '.' || $content == '..') continue;
        
        $fullPath = $folderPath . DIRECTORY_SEPARATOR . $content;
        $zipPath = $parentFolder . DIRECTORY_SEPARATOR . $content;
        
        if (is_dir($fullPath)) {
            // 如果是目录,递归处理
            addFolderToZip($zip, $fullPath, $zipPath);
        } else {
            // 如果是文件,直接添加
            $zip->addFile($fullPath, $zipPath);
        }
    }
}

$zip = new ZipArchive();
$zipFile = 'example.zip';

if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
    // 添加文件夹及其内容到压缩包
    addFolderToZip($zip, 'my_folder');
    $zip->close();
    echo '文件夹及其内容已成功压缩!';
} else {
    echo '无法创建压缩文件!';
}
?>

这个示例会将 my_folder 文件夹及其所有子文件夹和文件递归地添加到 .zip 文件中。

2. 读取 .zip 文件

如果你需要读取 .zip 文件中的内容,可以使用 ZipArchive 类提供的方法来提取和查看压缩包的文件。

2.1 列出 .zip 文件中的内容

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

if ($zip->open($zipFile) === TRUE) {
    // 列出压缩包中的文件
    $fileCount = $zip->numFiles;
    echo "压缩包中包含以下文件:<br>";
    for ($i = 0; $i < $fileCount; $i++) {
        echo $zip->getNameIndex($i) . "<br>";
    }

    // 关闭压缩包
    $zip->close();
} else {
    echo '无法打开压缩文件!';
}
?>

通过 numFiles 获取压缩包中的文件数量,使用 getNameIndex() 获取每个文件的名称。

2.2 提取文件

<?php
$zip = new ZipArchive();
$zipFile = 'example.zip';
$extractToDir = 'extracted/';

if ($zip->open($zipFile) === TRUE) {
    // 提取所有文件到指定目录
    $zip->extractTo($extractToDir);
    echo '文件已成功解压到 ' . $extractToDir;
    $zip->close();
} else {
    echo '无法打开压缩文件!';
}
?>

extractTo() 方法可以将 .zip 文件中的所有文件解压到指定的目录。如果你只想解压单个文件,可以提供目标路径:

$zip->extractTo($extractToDir, ['file1.txt']);  // 只解压特定文件

3. 更新 .zip 文件

你可以在 .zip 文件已经存在的情况下对其进行更新,例如添加新的文件或替换现有的文件。

3.1 向已存在的 .zip 文件添加新文件

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

if ($zip->open($zipFile) === TRUE) {
    // 向已存在的压缩包添加新文件
    $zip->addFile('file4.txt', 'file4.txt');
    $zip->close();
    echo '新文件已成功添加!';
} else {
    echo '无法打开压缩文件!';
}
?>

3.2 替换 .zip 文件中的现有文件

如果想要替换 .zip 文件中的某个文件,可以先使用 deleteName() 方法删除该文件,再添加新文件。

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

if ($zip->open($zipFile) === TRUE) {
    // 删除旧文件
    $zip->deleteName('file1.txt');
    
    // 添加新文件
    $zip->addFile('new_file1.txt', 'file1.txt');
    $zip->close();
    echo '文件已成功替换!';
} else {
    echo '无法打开压缩文件!';
}
?>

4. 关闭 ZipArchive

在完成所有操作后,务必调用 close() 方法来关闭 ZipArchive 对象并保存文件。

$zip->close();  // 关闭并保存

总结

  • 创建 .zip 文件:使用 ZipArchive::CREATE 模式创建并添加文件。
  • 列出 .zip 文件内容:使用 numFilesgetNameIndex 列出文件。
  • 提取 .zip 文件:使用 extractTo 提取文件或整个目录。
  • 更新 .zip 文件:通过 deleteName 删除文件,添加新文件。

通过 ZipArchive 类,PHP 提供了强大的文件压缩和解压功能,能够灵活处理 .zip 文件的创建、读取、更新和提取。