本例是zip压缩重点是,被压缩的文件按照其目录结构压缩进zip压缩包。
重要说明:
1. 同时把不同目录按照其目录结构压缩至同一zip文件,$zipFile内容目录结构不变,$folderPaths此时为数组 ['app/data/','public/data/'];数组内为不同目录路径
2. 把单个目录进行压缩,且压缩包内的目录保持其结构不变,$folderPaths此时为路径字符串'app/data/';
3. root_path() 为thinkphp的root绝对路径,此处为压缩包内保持目录结构相对路径的关键。
/** * 保持目录结构的压缩方法 * @param string $zipFile * @param $folderPaths * @return void */ public static function dirZip(string $zipFile, $folderPaths) { //1. $folderPaths 路径为数组 // 初始化zip对象 $zip = new \ZipArchive(); //打开压缩文件 $zip->open($zipFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE); if(is_array($folderPaths)) { foreach($folderPaths as $folderPath) { // 被压缩文件绝对路径 $rootPath = realpath($folderPath); // Create recursive directory iterator //获取所有文件数组SplFileInfo[] $files $files = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($rootPath), \RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $name => $file) { //要跳过所有子目录 if (!$file->isDir()) { // 真实文件路径 $filePath = $file->getRealPath(); // zip文件的相对路径 $relativePath = str_replace(root_path(), '', $filePath); //添加文件到压缩包 $zip->addFile($filePath, $relativePath); } } } } else { // 2. $folderPaths 路径为string // 被压缩文件绝对路径 $rootPath = realpath($folderPaths); // Create recursive directory iterator //获取所有文件数组SplFileInfo[] $files $files = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($rootPath), \RecursiveIteratorIterator::LEAVES_ONLY ); foreach ($files as $name => $file) { //要跳过所有子目录 if (!$file->isDir()) { // 要压缩的文件路径 $filePath = $file->getRealPath(); // zip目录内文件的相对路径 $relativePath = str_replace(root_path(), '', $filePath); //添加文件到压缩包 $zip->addFile($filePath, $relativePath); } } } $zip->close(); }