Laravel中向Zip文件添加子文件夹的问题
解决Laravel中Zip打包忽略子文件夹的问题
你的问题出在两个核心点:
File::files()方法仅会获取目标目录下的直接子文件,不会递归遍历子文件夹——第二个参数是控制是否包含隐藏文件,不是递归开关- 用
basename($value)作为Zip内的文件名,会把所有文件都放到Zip根目录,即使拿到子文件夹文件,原结构也会丢失
修改后的代码
$zip = new ZipArchive; $sourceDir = public_path('new_zip'); $zipPath = public_path('Downloads/new_zip.zip'); if ($zip->open($zipPath, ZipArchive::CREATE) === TRUE) { // 递归获取目录下所有层级的文件 $files = File::allFiles($sourceDir); foreach ($files as $file) { // 计算文件相对于源目录的路径,保留原文件夹结构 $relativePath = Str::after($file->getRealPath(), realpath($sourceDir) . DIRECTORY_SEPARATOR); // 将文件按原层级添加到Zip $zip->addFile($file->getRealPath(), $relativePath); } $zip->close(); }
关键说明
File::allFiles():Laravel提供的递归遍历方法,会自动获取指定目录下所有子文件夹内的文件Str::after():用来截取文件路径中源目录之后的部分,确保Zip内的文件结构和原文件夹完全一致- 用
realpath()和DIRECTORY_SEPARATOR处理路径,兼容Windows和Linux系统的路径分隔符
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

