当前位置: 首页> 最新文章列表> 如何使用 PHP 的 zip_read() 函数实现逐个读取和提取 ZIP 文件中的每个文件?

如何使用 PHP 的 zip_read() 函数实现逐个读取和提取 ZIP 文件中的每个文件?

M66 2025-06-23

在 PHP 中处理 ZIP 压缩文件是一个常见的任务,尤其在处理上传文件或自动归档时非常实用。PHP 的 Zip 扩展提供了一套完整的 API 来操作 ZIP 文件,其中 zip_read() 是用于遍历 ZIP 文件中条目的关键函数。本文将演示如何使用 zip_read() 函数逐个读取并提取 ZIP 文件中的每个文件内容。

一、环境准备

在开始之前,请确保你的 PHP 环境已启用 Zip 扩展。你可以通过以下命令检查是否启用:

<?php
phpinfo();
?>

在页面中搜索 Zip,如果存在则说明已经启用。如果没有,请根据你的操作系统安装并启用该扩展。

二、基本流程概览

使用 zip_read() 的基本步骤如下:

  1. 使用 zip_open() 打开 ZIP 文件。

  2. 使用 zip_read() 遍历每一个条目。

  3. 使用 zip_entry_name() 获取条目名称。

  4. 使用 zip_entry_open()zip_entry_read() 读取条目内容。

  5. 可选:将读取的内容写入文件实现提取操作。

三、示例代码解析

以下是一个完整示例,逐个读取 ZIP 文件中的每个文件并将其提取到指定目录:

<?php

$zipFile = 'archive.zip'; // 假设该文件位于当前目录
$extractTo = 'extracted_files/';

// 确保目标目录存在
if (!is_dir($extractTo)) {
    mkdir($extractTo, 0755, true);
}

// 打开 ZIP 文件
$zip = zip_open($zipFile);

if (is_resource($zip)) {
    while ($zipEntry = zip_read($zip)) {
        $entryName = zip_entry_name($zipEntry);
        $entryPath = $extractTo . $entryName;

        // 忽略目录条目,仅处理文件
        if (substr($entryName, -1) === '/') {
            continue;
        }

        // 尝试打开条目
        if (zip_entry_open($zip, $zipEntry, "r")) {
            $entryContent = zip_entry_read($zipEntry, zip_entry_filesize($zipEntry));

            // 确保目录结构存在
            $dir = dirname($entryPath);
            if (!is_dir($dir)) {
                mkdir($dir, 0755, true);
            }

            // 写入到文件
            file_put_contents($entryPath, $entryContent);

            // 可选:输出当前处理的文件
            echo "已提取文件: $entryName<br>";
            zip_entry_close($zipEntry);
        }
    }
    zip_close($zip);
    echo "ZIP 文件处理完成。";
} else {
    echo "无法打开 ZIP 文件。";
}
?>

四、注意事项

  • zip_read() 每次读取一个条目,需要在循环中多次调用以读取所有条目。

  • 使用 zip_entry_filesize() 获取文件大小以便读取完整内容。

  • 必须使用 zip_entry_open() 才能读取条目的内容。

  • 如果 ZIP 文件中存在多层目录,提取前应确保目录结构存在。

五、应用场景举例

  1. 在线文档解压处理:上传压缩包后自动解压到服务器特定目录。

  2. 批量图片处理:解压用户上传的 ZIP 文件中的图片,存入 /uploads/ 目录供后续处理。

  3. 内容备份与还原:系统自动打包数据备份并支持逐文件提取恢复。

六、扩展阅读