ZipArchive 提取 - 单个文件


ZipArchive extraction - single file

我有以下代码:

$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);
    }
}

我的目的是深入研究这个压缩文件,只拉出一个图像文件。代码原样在我希望它进入的目录中创建一个新的图像文件(它创建的文件具有正确的名称和扩展名,但它是空白的,0 字节(。如果我$iconFile更改为 iconFilePath,那么 PHP 会正确提取整个路径。路径的末尾是我想要的文件(仅提取单个文件(,并且已正确提取。但是,我不希望提取文件前面的文件夹,只提取一个文件。

所以,总而言之,我可以正确提取整个zip存档,我可以正确提取单个文件,但是

也提取了获取文件的文件路径,但是我无法正确提取单个文件本身。

我已经对它进行了大量搜索,但我无法发现我的错误。感谢您的帮助。

ZipArchive::extractTo()

整个文件夹结构提取到文件系统中;您应该改用ZipArchive::getFromName()。根据文档,这就是您正在寻找的内容:

使用其名称返回条目内容


$ipaFile= '/path/file.ipa';
// the pathway to my image file if the ipa file is unzipped.
$iconFilePath = "Payload/myapp.app/AppIcon40x40@2x.png";
$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。简单、快速。