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
相关产品推荐
相关产品推荐

