有点奇怪的问题。
我有一个包含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上测试时,它可以正常运行。
答案 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,以前无法使用)