在php(laravel)中将子文件夹添加到zip文件

分享于2022年11月15日 laravel php 问答
【问题标题】:Adding subfolders to zip file in php (laravel)在php(laravel)中将子文件夹添加到zip文件
【发布时间】:2022-11-07 01:34:57
【问题描述】:

我有一个功能可以很好地从文件夹文件创建 zip 文件。但是最近我需要将子文件夹添加到我的主文件夹中,现在我看到我的函数没有将这些子文件夹和文件添加到生成的 zip 文件中。

这是我目前拥有的:

$zip = new ZipArchive;

if ($zip->open(public_path('Downloads/new_zip.zip'), ZipArchive::CREATE) === TRUE)
{
    $files = File::files(public_path('new_zip'), true);
    foreach ($files as $key => $value) {
        $relativeNameInZipFile = basename($value);
        $zip->addFile($value, $relativeNameInZipFile);
    }
    $zip->close();
}

通过使用上面的代码,假设我有以下结构:

new_zip
 sample.txt

为我的文件夹创建 zip 文件可以正常工作。

如果我的文件夹结构是这样的:

new_zip
 sample.txt
 folder_a
  file_a.txt
 folder_b
  folder_c
   file_c.txt

然后它会忽略 folder_a 及以后的所有内容。

有什么建议么?


【解决方案1】:

你可以使用这个方法

第一个参数是要压缩其数据的目录的路径

第二个参数是生成的 zip 文件的路径

对于您的情况:

createZipArchive(public_path('new_zip'), public_path('Downloads/new_zip.zip'))
function createZipArchive(string $sourceDirPath, string $resultZipFilePath): bool
{
    $zip = new ZipArchive();
    if (true !== $zip->open($resultZipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE)) {
        return false;
    }

    /** @var SplFileInfo[] $files */
    $files = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator($sourceDirPath),
        RecursiveIteratorIterator::LEAVES_ONLY
    );

    foreach ($files as $file) {
        $filePath = $file->getRealPath();
        if ($file->isDir() || !$filePath) {
            continue;
        }
        $relativePath = substr($filePath, strlen($sourceDirPath) + 1);
        $zip->addFile($filePath, $relativePath);
    }

    return $zip->close();
}

此方法将完全再现源目录的文件夹结构。

和一点澄清:

  1. 要将目录“test_dir”和文件“test.txt”添加到存档中 - 您只需执行以下操作:
    $zip->addFile($filePath, "test_dir/test.txt");
    
    1. RecursiveDirectoryIterator 和 RecursiveIteratorIterator 用于递归遍历源文件夹的目录。它们是标准 php 库的一部分。您可以在官方 php 文档中了解它们

【讨论】: