Ваша попытка с copy()
была правильной. В отличие от ZipArchive::extractTo()
(который извлекает и создает также подпапки в месте назначения), метод copy()
просто копирует / извлекает указанный файл из архива в место назначения.
Этот пример должен работать:
$archive = "testarchive.zip";
$dest_dir = "./dest";
if (!is_dir($dest_dir)) {
if (!mkdir($dest_dir, 0755, true)) die("failed to make directory $dest_dir\n");
}
$zip = new ZipArchive;
if (!$zip->open($archive)) die("failed to open $archive");
for($i = 0; $i < $zip->numFiles; $i++) {
$file_name = $zip->getNameIndex($i);
$file_info = pathinfo($file_name);
$file_ext = pathinfo($file_name, PATHINFO_EXTENSION);
if (preg_match('/pdf/i', $file_ext)) {
copy("zip://".$archive."#".$file_name, $dest_dir.'/'.$file_info['basename']);
}
}
$zip->close();
Структура Testarchiv:
xxxxx@xxxxxx:~/Documents$ tree testarchive
testarchive
└── test
└── blubb
└── test.pdf
Папка testarchive
затем сжимается до testarchive.zip
.
После выполнения кода выше:
xxxxx@xxxxxx:~/Documents$ tree dest
dest
└── test.pdf