You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:11:16