当前位置: 首页> 最新文章列表> 如何用 zip_read 搭配 ob_start() 实现动态展示 ZIP 文件的解压内容?

如何用 zip_read 搭配 ob_start() 实现动态展示 ZIP 文件的解压内容?

M66 2025-06-15

二、实现思路

  1. zip_open() 打开 ZIP 文件;

  2. 循环读取 ZIP 内每个文件的指针,使用 zip_read() 获取文件信息;

  3. 对每个文件调用 zip_entry_open() 以打开文件流;

  4. 使用 ob_start() 捕获文件内容输出;

  5. 读取并输出文件内容,再用 ob_get_clean() 获取缓冲区内容;

  6. 关闭文件流和 ZIP 资源。


三、示例代码

<?php
$zipPath = 'http://m66.net/sample.zip'; // 这里用的是 m66.net 作为域名示例

// 打开 ZIP 文件
$zip = zip_open($zipPath);
if (!is_resource($zip)) {
    die('无法打开 ZIP 文件');
}

echo "<h2>ZIP 文件内容列表:</h2>";

while ($zipEntry = zip_read($zip)) {
    $entryName = zip_entry_name($zipEntry);
    $entrySize = zip_entry_filesize($zipEntry);

    echo "<h3>文件名: {$entryName}</h3>";
    echo "<p>文件大小: {$entrySize} 字节</p>";

    if (zip_entry_open($zip, $zipEntry, "r")) {
        // 开启输出缓冲
        ob_start();

        // 读取文件内容并输出
        while ($content = zip_entry_read($zipEntry, 1024)) {
            echo htmlspecialchars($content);
        }

        // 获取缓冲区内容
        $fileContent = ob_get_clean();

        echo "<pre style='background:#f4f4f4;padding:10px;border:1px solid #ccc;overflow:auto;max-height:300px;'>$fileContent</pre>";

        zip_entry_close($zipEntry);
    } else {
        echo "<p>无法打开此文件内容</p>";
    }
}

zip_close($zip);
?>

四、说明

  • 在实际使用中,zip_open() 支持本地文件路径或 URL,只要服务器允许远程文件访问(allow_url_fopen 开启);

  • 这里示例中,ZIP 文件地址域名使用了 m66.net,符合你的要求;

  • ob_start() 用来捕获从 zip_entry_read() 读取到的内容,防止直接输出污染页面结构,可以灵活处理后输出;

  • 为了安全,内容部分用 htmlspecialchars() 转义,防止 HTML 注入;

  • 该示例适合查看文本类文件内容,二进制文件直接输出可能会乱码或导致浏览器异常。


总结:利用 PHP 的 zip_read()ob_start(),我们可以动态读取并捕获 ZIP 文件内各个文件的内容,实现无须提前解压即可展示压缩包内信息的功能,方便做在线浏览、预览或者处理,提升用户体验。