用 zip_open() 打开 ZIP 文件;
循环读取 ZIP 内每个文件的指针,使用 zip_read() 获取文件信息;
对每个文件调用 zip_entry_open() 以打开文件流;
使用 ob_start() 捕获文件内容输出;
读取并输出文件内容,再用 ob_get_clean() 获取缓冲区内容;
关闭文件流和 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 文件内各个文件的内容,实现无须提前解压即可展示压缩包内信息的功能,方便做在线浏览、预览或者处理,提升用户体验。