2014-12-19 2 views
2

У меня есть следующий код:ZipArchive экстракция - один файл

$ipaFile= '/path/file.ipa'; 
$iconFilePath = "Payload/myapp.app/[email protected]"; // the pathway to my image file if the ipa file is unzipped. 
$iconFile = "[email protected]"; 
$iconSaveFile = '/path/'; 

$zip = new ZipArchive(); 

if ($zip->open($ipaFile) === TRUE) { 
    if($zip->locateName($iconFilePath) !== FALSE) { 

    $zip->extractTo($iconSaveFile, $iconFile); 

    } 
} 

Моя цель состоит в том, чтобы погрузиться в этот архивный файл и только вытащить файл изображения. Код as создает новый файл изображения в каталоге, в который я хочу войти (файл, который он создает, имеет правильное имя и расширение, но он пуст, 0 байт). Если я изменяю $ iconFile на iconFilePath, тогда PHP правильно извлекает весь путь. В конце пути находится файл (только один файл извлекается), я хочу, и он будет правильно извлечен. Тем не менее, я не хочу, чтобы папки, предшествующие файлу, были извлечены, только один файл.

SO, в общем, я могу правильно извлечь весь zip-архив, я могу правильно извлечь один файл, но путь к файлу для доступа к файлу также извлекается, но я НЕ МОГУ НЕ правильно извлечь один файл сам по себе ,

Я сделал много поиска на нем, и я не могу определить свою ошибку. Спасибо за вашу помощь.

ответ

2

ZipArchive::extractTo() извлекает всю структуру папок; вы пробовали ZipArchive::getFromName(), что звучит, как будто оно может работать лучше?

$ipaFile= '/path/file.ipa'; 
$iconFilePath = "Payload/myapp.app/[email protected]"; // the pathway to my image file if the ipa file is unzipped. 
$iconFile = "[email protected]"; 
$iconSaveFile = '/path/'; 

$zip = new ZipArchive(); 

if ($zip->open($ipaFile) === TRUE) { 
    if($iconData = $zip->getFromName($iconFilePath)) { 
     file_put_contents("$iconSaveFile$iconFile", $iconData); 
    } 
} 

Это совершенно непроверенный код, просто выбросив его там! Если это не работает, и вы знаете все связанные с ним пути, вы можете просто переместить файл после его извлечения, не так ли?

+0

Оба эти решения хорошо. Постарайтесь использовать этот ответ, спасибо. –

0

Существует несколько способов индивидуального извлечения и/или чтения, а затем записи файлов, которые находятся в архиве .zip. getStream является одним из возможных способов:

$iconSaveFile = "/path/";    // external path 
$ipaFile = "file.ipa";     // zipped file 
$iconFilePath = "Payload/myapp.app/"; // archive path 
$iconFile = "[email protected]";  // 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 на наш новый путь. Простой и быстрый.