PHP Zip归档提取整个文件夹

klsxnrf1  于 2023-06-28  发布在  PHP
关注(0)|答案(1)|浏览(113)

使用PHP ZipArchive非常简单,但我在解压缩整个文件夹时遇到了麻烦。

$zip=new \ZipArchive;
$zip->open('zipped.docx');
$zip->extractTo('unzipped/',['word/document.xml','word/media/*']);
$zip->close();

我正在尝试解压缩一个docx文档,并提取document.xml以及与docx相关的图像的媒体文件夹。
我试过:word/media/*word/media/word/media没有成功。
有这种可能吗?

beq87vna

beq87vna1#

是的,可以使用PHP的ZipArchive类提取整个文件夹。但是,ZipArchive类不支持通配符模式,如“word/media/*”,用于一次提取多个文件或目录。
要解压缩“word/document.xml”文件和“word/media”文件夹及其内容,您可以执行以下步骤:

$zip = new \ZipArchive;
$zipFile = 'zipped.docx';
$extractPath = 'unzipped/';

if ($zip->open($zipFile) === true) {
    // Extract document.xml
    $zip->extractTo($extractPath, 'word/document.xml');

    // Extract the media folder and its contents
    $mediaFolderIndex = $zip->locateName('word/media/');
    if ($mediaFolderIndex !== false) {
        for ($i = $mediaFolderIndex; $i < $zip->numFiles; $i++) {
            $filename = $zip->getNameIndex($i);
            if (strpos($filename, 'word/media/') === 0) {
                $zip->extractTo($extractPath, $filename);
            } else {
                break; // Exit the loop when we reach a file outside the media folder
            }
        }
    }

    $zip->close();
} else {
    echo 'Failed to open the zip file.';
}

在这段代码中,我们首先使用open()方法打开zip文件。然后我们使用extractTo()提取“word/document.xml”文件。
接下来,我们使用locateName()定位“word/media/”文件夹的索引。如果找到了该文件夹,我们将从该索引开始遍历zip文件条目。对于“word/media/”文件夹中的每个条目,我们使用extractTo()提取它。
请注意,此代码假定“word/media”文件夹及其内容在DOCX文件中以可预测的方式进行结构化。如果结构发生变化或有其他特定要求,则可能需要相应地调整代码。

相关问题