在 PHP 中处理 ZIP 压缩文件是一个常见的任务,尤其在处理上传文件或自动归档时非常实用。PHP 的 Zip 扩展提供了一套完整的 API 来操作 ZIP 文件,其中 zip_read() 是用于遍历 ZIP 文件中条目的关键函数。本文将演示如何使用 zip_read() 函数逐个读取并提取 ZIP 文件中的每个文件内容。
在开始之前,请确保你的 PHP 环境已启用 Zip 扩展。你可以通过以下命令检查是否启用:
<?php
phpinfo();
?>
在页面中搜索 Zip,如果存在则说明已经启用。如果没有,请根据你的操作系统安装并启用该扩展。
使用 zip_read() 的基本步骤如下:
使用 zip_open() 打开 ZIP 文件。
使用 zip_read() 遍历每一个条目。
使用 zip_entry_name() 获取条目名称。
使用 zip_entry_open() 和 zip_entry_read() 读取条目内容。
可选:将读取的内容写入文件实现提取操作。
以下是一个完整示例,逐个读取 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 文件中存在多层目录,提取前应确保目录结构存在。
在线文档解压处理:上传压缩包后自动解压到服务器特定目录。
批量图片处理:解压用户上传的 ZIP 文件中的图片,存入 /uploads/ 目录供后续处理。
内容备份与还原:系统自动打包数据备份并支持逐文件提取恢复。