美文网首页
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