У меня есть следующий код:
$ipaFile= '/path/file.ipa'; $iconFilePath = "Payload/myapp.app/AppIcon40x40@2x.png"; // the pathway to my image file if the ipa file is unzipped. $iconFile = "AppIcon40x40@2x.png"; $iconSaveFile = '/path/'; $zip = new ZipArchive(); if ($zip->open($ipaFile) === TRUE) { if($zip->locateName($iconFilePath) !== FALSE) { $zip->extractTo($iconSaveFile, $iconFile); } }
Моя цель – погрузиться в этот zipped-файл и вытащить только файл изображения. Код as создает новый файл изображения в каталоге, в который я хочу войти (файл, который он создает, имеет правильное имя и расширение, но он пуст, 0 байт). Если я изменил $ iconFile на iconFilePath, тогда PHP правильно извлечет весь путь. В конце пути находится файл (только один файл извлекается), я хочу, и он будет правильно извлечен. Тем не менее, я не хочу, чтобы папки, предшествующие файлу, были извлечены, только один файл.
Итак, в общем, я могу правильно извлечь весь zip-архив, я могу правильно извлечь один файл, но путь к файлу для доступа к файлу также извлекается, но я НЕ МОГУ НЕ правильно извлечь один файл сам по себе.
Я сделал много поиска на нем, и я не могу определить свою ошибку. Спасибо за вашу помощь.
ZipArchive::extractTo()
извлекает всю структуру папок; вы пробовали ZipArchive::getFromName()
, похоже, что это может сработать лучше?
$ipaFile= '/path/file.ipa'; $iconFilePath = "Payload/myapp.app/AppIcon40x40@2x.png"; // the pathway to my image file if the ipa file is unzipped. $iconFile = "AppIcon40x40@2x.png"; $iconSaveFile = '/path/'; $zip = new ZipArchive(); if ($zip->open($ipaFile) === TRUE) { if($iconData = $zip->getFromName($iconFilePath)) { file_put_contents("$iconSaveFile$iconFile", $iconData); } }
Это абсолютно непроверенный код, просто выбросив его! Если это не работает, и вы знаете все связанные с ним пути, вы можете просто переместить файл после его извлечения, не так ли?
Существует несколько способов индивидуально извлекать и / или читать, а затем записывать файлы, которые находятся в архиве .zip. getStream – один из возможных способов:
$iconSaveFile = "/path/"; // external path $ipaFile = "file.ipa"; // zipped file $iconFilePath = "Payload/myapp.app/"; // archive path $iconFile = "AppIcon40x40@2x.png"; // file to extract $iconData = ''; $zp = new ZipArchive(); if ($zp->open($iconSaveFile . $ipaFile)) { $fp = $zp->getStream($iconFilePath . $iconFile); if(!$fp) exit("failed\n"); while (!feof($fp)) { $iconData .= fread($fp, 8192); } fclose($fp); file_put_contents($iconSaveFile . $iconFile, $iconData); }
Используя getStream
мы можем читать в буфер только то, что мы действительно делаем, а затем записывать данные в новый .png на новый путь. Простой и быстрый.