PHP Zip 存档提取整个文件夹

PHP Zip Archive Extract Entire Folder

提问人:Maciek 提问时间:6/24/2023 更新时间:6/24/2023 访问量:79

问:

我正在使用 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

有可能吗?

php ziparchive

评论


答:

2赞 Ozan Kurt 6/24/2023 #1

是的,可以使用 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.';
}

在此代码中,我们首先使用 该方法打开 zip 文件。然后我们使用 提取“word/document.xml”文件。open()extractTo()

接下来,我们使用 找到 “word/media/” 文件夹的索引。如果找到该文件夹,我们将从该索引开始循环访问 zip 文件条目。对于“word/media/”文件夹中的每个条目,我们使用 .locateName()extractTo()

请注意,此代码假定“word/media”文件夹及其内容在 DOCX 文件中以可预测的方式构建。如果结构不同或有其他特定要求,则可能需要相应地调整代码。

评论

1赞 DavidW 6/24/2023
这看起来像 ChatGPT
0赞 Ozan Kurt 6/24/2023
它有效......