ZipArchive::addFile生成的压缩包Windows有目录Linux解压扁平化如何解决
问题根源
你在Windows环境下生成ZIP包时,写入压缩包的文件路径使用了Windows专属的反斜杠\作为分隔符。ZIP格式规范明确要求跨平台兼容的路径需使用正斜杠/作为分隔符,Linux系统下的解压工具会将反斜杠识别为普通文件名的一部分,而非目录分层标志,因此所有文件都会被当作无目录的单文件直接解压到当前目录,出现扁平化问题。WinRAR对Windows路径做了兼容处理,所以解压正常。
修复方案
只需要在写入相对路径到压缩包前,将所有反斜杠替换为标准正斜杠即可:
function compress(string $path) { $zip = new ZipArchive(); $zip->open(dirname(SOURCE_PATH, 1) . '\\' . explode('\\', SOURCE_PATH)[count(explode('\\', SOURCE_PATH)) - 2] . '.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE); $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::LEAVES_ONLY); foreach ($files as $file) { if (!$file->isDir()) { $real = $file->getRealPath(); $relative = substr($real, strlen($path)); // 替换路径分隔符为ZIP标准正斜杠,兼容全平台 $relative = str_replace('\\', '/', $relative); $zip->addFile($real, $relative); } } $zip->close(); }
修改后生成的压缩包可同时在Windows、Linux环境下正常解压并保留目录结构。
内容的提问来源于stack exchange,提问作者Faye D.
相关产品推荐
相关产品推荐

