PHP生成的zip压缩包在js-dos中目录结构异常但Windows下显示正常求助
问题定位与修复方案
根本原因
- ZIP格式规范明确要求路径分隔符使用正斜杠
/,你当前代码在Windows环境运行时生成的相对路径默认使用反斜杠\,WinRAR等现代解压工具做了兼容处理,但js-dos内置的老版DOS类ZIP解析器无法正确识别 - 你仅添加文件未显式创建目录条目,js-dos的解析器不会自动合并多个文件对应的相同父目录,会为每个文件单独生成目录条目,最终出现多个同名文件夹的异常
修复代码
纯PHP原生实现,无需调用外部命令:
$rootPath = realpath($filefoldername . "/"); $zip = new ZipArchive(); $zip->open($filefoldername . '/xp.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE); $filesZ = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($rootPath), RecursiveIteratorIterator::LEAVES_ONLY ); $addedDirs = []; // 记录已添加的目录避免重复创建 foreach ($filesZ as $fileZ) { if (!$fileZ->isDir()) { $filePath = $fileZ->getRealPath(); $relativePath = substr($filePath, strlen($rootPath) + 1); // 替换所有反斜杠为ZIP规范要求的正斜杠 $relativePath = str_replace('\\', '/', $relativePath); // 逐层显式添加文件的所有父目录 $pathParts = explode('/', $relativePath); array_pop($pathParts); // 移除文件名部分,只保留目录层级 $dirPath = ''; foreach ($pathParts as $part) { $dirPath .= $part . '/'; if (!isset($addedDirs[$dirPath])) { $zip->addEmptyDir($dirPath); // 设置DOS兼容的目录属性,排除Linux权限位等信息干扰 $zip->setExternalAttributesName($dirPath, ZipArchive::OPSYS_DOS, 0x10); $addedDirs[$dirPath] = true; } } // 添加文件到压缩包 $zip->addFile($filePath, $relativePath); // 设置DOS兼容的普通文件属性 $zip->setExternalAttributesName($relativePath, ZipArchive::OPSYS_DOS, 0x20); } } $zip->close();
修改后生成的ZIP包在WinRAR中打开结构和之前完全一致,挂载到js-dos后即可显示正常的目录结构。
内容的提问来源于stack exchange,提问作者mochaMame
相关产品推荐
相关产品推荐

