Вы можете сделать это, используя синтаксис zip://
вместо Zip::extractTo
, как описано в руководстве php для extractTo () .
Вы должны соответствовать имени файла изображенияи затем скопируйте его:
if ($entry['size'] > 0 && preg_match('#\.(jpg)$#i', $entry['name'])) {
copy('zip://' . $file_path . '#' . $entry['name'], '/root_dir/' . md5($entry['name']) . '.jpg');
}
Вышеприведенный код заменяет ваш оператор for цикла if и делает ваш extractTo
ненужным.Я использовал хэш md5 исходного имени файла, чтобы создать уникальное имя.Крайне маловероятно, что у вас возникнут какие-либо проблемы с перезаписью файлов, поскольку коллизии хешей встречаются редко.Обратите внимание, что это немного сложная задача, и вместо этого вы можете сделать str_replace('/.', '', $entry['name'])
, чтобы создать новое уникальное имя файла.
Полное решение (измененная версия вашего кода):
<?php
$zip = new ZipArchive();
if ($zip->open($file_path)) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$entry = $zip->statIndex($i);
// is it an image?
if ($entry['size'] > 0 && preg_match('#\.(jpg)$#i', $entry['name'])) {
# use hash (more expensive, but can be useful depending on what you're doing
$new_filename = md5($entry['name']) . '.jpg';
# or str_replace for cheaper, potentially longer name:
# $new_filename = str_replace('/.', '', $entry['name']);
copy('zip://' . $file_path . '#' . $entry['name'], '/myFolder/' . $new_filename);
}
}
$zip->close();
}
?>