You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP ZipArchive无法提取整个文件夹,如何提取docx的media目录及文件?

用PHP ZipArchive提取DOCX指定文件和文件夹的解决方案

PHP的ZipArchive类本身不支持通配符匹配提取,所以你直接用word/media/*这类路径肯定没用,得自己遍历压缩包内的条目来筛选提取。以下是可行的实现代码:

<?php
$docxPath = 'your-file.docx'; // 替换成你的DOCX文件路径
$extractDir = './extracted-files'; // 提取到的目标目录

// 创建目标目录(如果不存在)
if (!is_dir($extractDir)) {
    mkdir($extractDir, 0755, true);
}

$zip = new ZipArchive();
if ($zip->open($docxPath) === true) {
    // 遍历压缩包内所有条目
    for ($i = 0; $i < $zip->numFiles; $i++) {
        $entryName = $zip->getNameIndex($i);
        
        // 匹配目标文件:word/document.xml,或者属于word/media目录下的所有内容
        if ($entryName === 'word/document.xml' || str_starts_with($entryName, 'word/media/')) {
            // 处理条目路径,生成本地保存路径
            $localPath = $extractDir . DIRECTORY_SEPARATOR . $entryName;
            
            // 如果当前条目是目录,先创建目录
            if (substr($entryName, -1) === '/') {
                if (!is_dir($localPath)) {
                    mkdir($localPath, 0755, true);
                }
                continue;
            }
            
            // 提取文件到指定路径
            $zip->extractTo($extractDir, $entryName);
        }
    }
    $zip->close();
    echo '提取完成';
} else {
    echo '无法打开DOCX文件';
}
?>

关键说明

  • DOCX本质是ZIP压缩包,所以ZipArchive可以直接处理
  • str_starts_with()是PHP 8.0+的函数,如果用低版本,可以换成substr($entryName, 0, 11) === 'word/media/'
  • 必须先判断条目是否为目录并创建,否则提取media下的文件时会因为目录不存在失败
  • 不要试图用extractTo的第二个参数传通配符,这个方法只接受单个文件名或数组,不支持模糊匹配

内容的提问来源于stack exchange,提问作者Maciek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:04:57