压缩ZipArchive到PPTX错误

时间:2018-01-23 13:58:43

标签: php ziparchive

有点奇怪的问题。

我有一个包含PowerPoint数据的文件夹,我需要压缩然后重命名为pptx。 如果我手动创建.zip并将文件复制到其中,然后重命名,它就像预期的那样工作,但是当我使用ZipArchive存档数据然后重命名创建的文件时,它不起作用。

以编程方式创建的存档也比手动创建的存档小几KB。 存档比较工具告诉我,我在两个拉链中都有完全相同的文件,包括隐藏文件。

但这里真的很奇怪:如果我制作另一个空档案,然后通过简单的选择,拖放,新档案,从编程创建的档案中复制粘贴文件将重命名为.pptx时使用,并且与第一个手动创建的文件具有相同的大小。

    $dir = 'pptx/test/compiled';
    $zip_file = 'pptx/test/file.zip';

    // Get real path for our folder
    $rootPath = realpath($dir);

    // Initialize archive object
    $zip = new \ZipArchive();
    $zip->open($zip_file, \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)
    {
        // Skip directories (they would be added automatically)
        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);
        }
    }

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

更新

这在Windows上似乎只是一个问题,在Mac上测试时,它可以正常运行。

1 个答案:

答案 0 :(得分:0)

我再次遇到此问题,并在LibreOffice论坛上寻求帮助(该问题仅针对Impress)之后,我发现在Windows中,归档时使用的文件路径带有反斜杠,从而导致了问题。

我在归档功能中添加了两行以清理路径:

        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Replace backward with forward slashes, for compatibility issues
        $filePath = str_replace('\\', '/', $filePath);
        $relativePath = str_replace('\\', '/', $relativePath);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);

现在我的代码可以正常运行了。 (我使用LibreOffice headless作为exec()来转换为pdf,以前无法使用)