2014-12-19 36 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); 

    } 
} 

我的目的是潛入該壓縮文件,只拉出一個圖像文件。代碼是在我想要的目錄中創建一個新的映像文件(它創建的文件具有正確的名稱和擴展名,但它是空的,0字節)。 如果我將$ iconFile更改爲iconFilePath,則PHP會正確提取整個路徑。路徑的末尾是我想要的文件(僅提取單個文件),並且正確提取。但是,我不希望文件前面的文件夾被提取,只是一個文件。

總之,我可以正確提取整個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

這兩個工作都很好。結束使用這個答案,謝謝。 – 2014-12-19 17:40:15

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我們能夠讀入緩衝區只有我們真正是後,然後將數據寫入到一個新的巴紐我們的新路徑。簡單,快捷。