【问题标题】: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 及以后的所有内容。

有什么建议么?

【问题讨论】:

    标签: php laravel


    【解决方案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 文档中了解它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2010-10-02
      • 2013-09-25
      • 2018-01-18
      相关资源
      最近更新 更多