/**
* 压缩指定目录到 ZIP 文件中。
*
* @param string $sourceDir 要压缩的源文件夹路径。
* @param string $zipFilename 生成的压缩文件名。
*
* @return bool 压缩成功返回 true,否则返回 false。
*/
function compressToZip($sourceDir, $zipFilename)
{
// 创建 ZipArchive 实例
$zip = new \ZipArchive();
// 获取压缩文件的绝对路径和目标目录
$destination = $sourceDir . '/' . $zipFilename;
// 打开压缩文件并设置模式为创建新文件
if ($zip->open($destination, \ZipArchive::CREATE) === true) {
// 递归遍历要压缩的源文件夹中的所有文件
$files = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($sourceDir),
\RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
// 如果当前文件不是目录,则将其添加到压缩文件中
if (!$file->isDir()) {
$filePath = $file->getRealPath(); // 获取文件的绝对路径
$relativePath = substr($filePath, strlen($sourceDir) + 1); // 计算文件相对于源文件夹的路径
// 将文件添加到压缩文件中,使用相对路径作为文件名
$zip->addFile($filePath, $relativePath);
}
}
// 关闭 ZipArchive 实例
$zip->close();
return true;
} else {
return false;
}
}
function compressToZips($sourceDir, $zipFilename)
{
// 创建 ZipArchive 实例
$zip = new \ZipArchive();
// 获取压缩文件的绝对路径和目标目录
$destination = $sourceDir . '/' . $zipFilename;
// 打开压缩文件并设置模式为创建新文件
if ($zip->open($destination, \ZipArchive::CREATE) === true) {
// 递归遍历要压缩的源文件夹中的所有文件
$files = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($sourceDir),
\RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) { // 如果当前文件不是目录,则将其添加到压缩文件中
$filePath = $file->getRealPath(); // 获取文件的绝对路径
$relativePath = substr($filePath, strlen($sourceDir) + 1); // 计算文件相对于源文件夹的路径
// 将文件添加到压缩文件中,使用相对路径作为文件名
$zip->addFile($filePath, $relativePath);
} else { // 如果当前文件是目录
$relativePath = substr($file->getRealPath(), strlen($sourceDir) + 1); // 计算目录相对于源文件夹的路径
// 将目录添加到压缩文件中
$zip->addEmptyDir($relativePath);
}
}
// 关闭 ZipArchive 实例
$zip->close();
return true;
} else {
return false;
}
}
// 使用示例
// 压缩 /www/wwwroot/audios 目录到 example.zip 文件中
$sourceDir = '/www/wwwroot/audios';
$zipFilename = 'example.zip';
if (compressDirectoryToZip($sourceDir, $zipFilename)) {
echo '压缩完成!压缩文件路径:' . $sourceDir . '/' . $zipFilename;
} else {
echo '压缩失败!';
}
/**
* 解压缩 ZIP 文件到目标路径
*
* @param string $zipFile 待解压的 ZIP 文件路径
* @param string $targetPath 解压出文件的目标路径
*
* @return array|bool 返回解压出来的文件名数组,或者操作失败返回 false
*/
function unzipFiles3($zipFile, $targetPath)
{
// 创建一个 ZipArchive 实例
$zip = new \ZipArchive();
// 打开待解压的压缩文件
if ($zip->open($zipFile) !== true) {
return false;
}
// 保存解压出来的文件名数组
$fileNames = [];
// 获取压缩文件的根目录
$prefix = '';
$numFiles = $zip->numFiles;
for ($i = 0; $i < $numFiles; $i++) {
$name = $zip->getNameIndex($i);
$pos = strpos($name, '/');
if ($pos === false) {
// 如果文件名没有目录,则没有根目录
$prefix = '';
} else {
// 否则,获取目录名作为根目录
$dir = substr($name, 0, $pos);
if ($prefix === '' || strlen($dir) < strlen($prefix)) {
$prefix = $dir;
}
}
}
// 将所有文件和目录解压到指定目标路径下
for ($i = 0; $i < $numFiles; $i++) {
$name = $zip->getNameIndex($i);
if ($prefix !== '') {
// 如果有根目录,则去掉根目录部分
$name = substr($name, strlen($prefix) + 1);
}
if (!empty($name)) {
$exportPath = $targetPath . DIRECTORY_SEPARATOR . $name;
$fileNames[] = $exportPath; // 保存文件名
if (substr($name, -1) == DIRECTORY_SEPARATOR) {
// 如果是目录,则创建目录
if (!is_dir($exportPath)) {
mkdir($exportPath, 0777, true);
}
} else {
// 如果是文件,则解压出文件并写入目标路径
$stream = $zip->getStream($zip->getNameIndex($i));
if ($stream !== false) {
file_put_contents($exportPath, stream_get_contents($stream));
fclose($stream);
}
}
}
}
// 关闭 ZipArchive 实例
$zip->close();
// 删除上传的压缩文件
unlink($zipFile);
// 返回解压出来的文件名数组
return $fileNames;
}
/**
* 解压zip压缩包
* @param $UpFilePath 上传文件:"../uploads/zip/test.zip"
* @param $targetPath 解压文件路径:"/www/test/zip"
* @return bool
*/
function unzipFile($upFile, $targetPath)
{
// 创建目录
if (!is_dir($targetPath)) {
mkdir($targetPath, 0777, true);
}
// 解压缩文件夹内的文件
$zip = new \ZipArchive();
$res = $zip->open($upFile);
if ($res === TRUE) {
$zip->extractTo($targetPath);
// 获取解压后的文件夹名称
$extracted_folder_name = $targetPath . '/' . pathinfo($upFile, PATHINFO_FILENAME);
// 将解压后的文件移动到目标文件夹中
$files = @scandir($extracted_folder_name);
foreach ($files as $file) {
if ($file !== '.' && $file !== '..') {
rename($extracted_folder_name . '/' . $file, $targetPath . '/' . $file);
}
}
// 删除解压后的文件夹
rmdir($extracted_folder_name);
// 删除上传的压缩文件
unlink($upFile);
// 解压缩成功
return true;
} else {
return false;
}
}
// 使用示例
$upFile = '../uploads/zip/test.zip';
$targetPath = '/www/test/zip';
if (unzipFile($upFile, $targetPath)) {
echo '解压缩成功!';
} else {
echo '解压缩失败!';
}
网友评论