ZipArchive::addFile() 在 Windows 中创建具有树结构的 zip 文件,但在 Linux 中扁平化

ZipArchive::addFile() creates zip files with tree structure in Windows but flattened in Linux

我使用 PHP 的 ZipArchive 库创建了一个 zip 文件,以便轻松地将某些电子商店同步服务的图像从桌面传输到电子商店的 Web 服务器。我用来创建 zip 的脚本如下:

function compress(string $path)
{
    $zip = new ZipArchive();
    $zip->open(dirname(SOURCE_PATH, 1) . '\' . explode('\', SOURCE_PATH)[count(explode('\', SOURCE_PATH)) - 2] . '.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE); // Some path manipulation here, to actually take the whole "parent" folder of the path passed to the function's parameter

    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::LEAVES_ONLY);

    foreach ($files as $file) {
        if (!$file->isDir()) {
            $real = $file->getRealPath();
            $relative = substr($real, strlen($path));

            $zip->addFile($real, $relative);
        }
    }

    $zip->close();
}

我的问题是,当您在 WinRAR 中查看 zip 的内容时,它们在文件夹中正常显示;当您解压缩 zip 时,将再次构建整个文件夹树和文件。但是,当您将 zip 文件传输到托管网店的 linux 服务器并解压缩时,文件将全部解压缩到上传 zip 的文件夹中,就好像 zip 文件被“扁平化”了一样。 ..

请看下面两个视频:

Windows

Linux

我做错了什么?我是第一次使用ZipArchive,所以没有太多经验。

zip 中的文件路径必须使用 / 作为路径分隔符,您可以尝试下面的代码

function compress(string $path)
{
    $zip = new ZipArchive();
    $zip->open(dirname(SOURCE_PATH, 1) . '\' . explode('\', SOURCE_PATH)[count(explode('\', SOURCE_PATH)) - 2] . '.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE); // Some path manipulation here, to actually take the whole "parent" folder of the path passed to the function's parameter

    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::LEAVES_ONLY);

    foreach ($files as $file) {
        if (!$file->isDir()) {
            $real = $file->getRealPath();
            $relative = substr($real, strlen($path));
            // replace path separator
            $relative = str_replace('\', '/', $relative);
            $zip->addFile($real, $relative);
        }
    }

    $zip->close();
}