如何在PHP中压缩整个文件夹,甚至是空文件夹?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在PHP中压缩整个文件夹,甚至是空文件夹?相关的知识,希望对你有一定的参考价值。

我正在尝试从我的应用程序(Laravel 5.8)上的文件夹下载一个zip,它正在运行,但它们会跳过所有空文件夹,我需要它们在zip中。

我已经尝试过作曲家的ZipArchive(php)和chumper / zipper。

知道我该怎么办?

这是一个运行mysql 5,PHP 7.2和Apache2的Linux服务器。

$files = glob($folder_path);
\Zipper::make($folder_path.'/'.$folder_main_name.'.zip')->add($files)->close();

这个lib只接受glob,但是如果你有任何解决方案可行,我可以很容易地放弃它。

答案
// Get real path for our folder
$rootPath = realpath('folder-to-zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Is this a directory?
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);
    }
    else {
        $end2 = substr($file,-2);
        if ($end2 == "/.") {
           $folder = substr($file, 0, -2);
           $zip->addEmptyDir($folder);
        }
    }
}

// Zip archive will be created only after closing object
$zip->close();

** 试试这个。脱了我的头顶,没有经过测试。但它的总体思路。

以上是关于如何在PHP中压缩整个文件夹,甚至是空文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

如何[递归]在PHP中压缩目录?

如何zstd从输入文件中压缩一大块字节?

如何读取Hadoop中压缩的文件

如何在android中压缩和解压缩png图像

如何在 Django 中压缩多个上传的文件,然后再将其保存到数据库?

在java中压缩和解压缩7z文件