美文网首页
php 使用ZipArchive 压缩和解压文件 2023-04

php 使用ZipArchive 压缩和解压文件 2023-04

作者: 阿然学编程 | 来源:发表于2023-04-06 14:00 被阅读0次
  • 压缩目录
/**
 * 压缩指定目录到 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 '解压缩失败!';
}

相关文章

网友评论

      本文标题:php 使用ZipArchive 压缩和解压文件 2023-04

      本文链接:https://www.haomeiwen.com/subject/vgfuddtx.html