Мне нужно разархивировать загруженный контент. Но для целей безопасности необходимо проверить, что файлы – это только файлы изображений, чтобы кто-то не мог добавить php в zip, а затем запустить его позже.
При выполнении распаковки мне также необходимо сохранить структуру файла.
$zip->extractTo($save_path . $file_name, array('*.jpg','*.jpeg','*.png','*.gif') );
не возвращает null. Есть ли параметр, который я могу использовать для этого, или должен ли я перебирать петлю через zip-файл, используя регулярное выражение, чтобы соответствовать расширениям и создавать папки и сохранять файлы с кодом?
благодаря
от php.net , обработка файлов .txt
<?php $value="test.zip"; $filename="zip_files/$value"; $zip = new ZipArchive; if ($zip->open($filename) === true) { echo "Generating TEXT file."; for($i = 0; $i < $zip->numFiles; $i++) { $entry = $zip->getNameIndex($i); if(preg_match('#\.(txt)$#i', $entry)) { ////This copy function will move the entry to the root of "txt_files" without creating any sub-folders unlike "ZIP->EXTRACTO" function. copy('zip://'.dirname(__FILE__).'/zip_files/'.$value.'#'.$entry, 'txt_files/'.$value.'.txt'); } } $zip->close(); } else{ echo "ZIP archive failed"; } ?>
для тех, кому это понадобится в будущем, это мое решение. Спасибо Сиро за сообщение, мне только пришлось немного продлить. Чтобы убедиться, что все папки созданы, я сначала петлю для папок, а затем выполняю расшифровку.
$ZipFileName = dirname(__FILE__)."/test.zip"; $home_folder = dirname(__FILE__)."/unziped"; mkdir($home_folder); $zip = new ZipArchive; if ($zip->open($ZipFileName ) === true) { //make all the folders for($i = 0; $i < $zip->numFiles; $i++) { $OnlyFileName = $zip->getNameIndex($i); $FullFileName = $zip->statIndex($i); if ($FullFileName['name'][strlen($FullFileName['name'])-1] =="/") { @mkdir($home_folder."/".$FullFileName['name'],0700,true); } } //unzip into the folders for($i = 0; $i < $zip->numFiles; $i++) { $OnlyFileName = $zip->getNameIndex($i); $FullFileName = $zip->statIndex($i); if (!($FullFileName['name'][strlen($FullFileName['name'])-1] =="/")) { if (preg_match('#\.(jpg|jpeg|gif|png)$#i', $OnlyFileName)) { copy('zip://'. $ZipFileName .'#'. $OnlyFileName , $home_folder."/".$FullFileName['name'] ); } } } $zip->close(); } else { echo "Error: Can't open zip file"; }