PHP压缩文件提取-条目大小错误


PHP zip file extraction - wrong size of entry

我正在使用在线发票系统,他们的API允许我以字符串的形式下载PDF发票,这是base64编码的压缩PDF。我解码这个字符串与base64_decode(),然后我把它保存为文件:file_put_contents('temp/soubor.zip', $data);

现在如果我想在windows中打开这个zip文件是可以的。但我想通过php提取它如果我调用:

$zip = new ZipArchive;
if ($zip->open('temp/soubor.zip') === TRUE) {
    print_r($zip->statIndex(0));
    $zip->close();
} 

Array ( [name] => zipEntryName [index] => 0 [crc] => 1906707552 [size] => -1 [mtime] => 1358774308 [comp_size] => -1 [comp_method] => 8 )

一切都很好,除了大小-1,这是一个大问题,因为它不会提取任何东西。

现在有趣的是:如果我在winRar中打开zip文件,选择修复存档,并在我的脚本中打开修复的zip文件,我得到正确的大小和文件可以正确提取。btw存档文件只有260kB

看起来像格式化的存档,可能是根据未知大小的数据流"实时"构建的,并不是所有的ZIP包都正确地写入输出(或者,流没有刷新,所以中心目录没有写入)。您可以通过运行zipinfo: http://www.info-zip.org/mans/zipinfo.html

查看详细的zip文件信息。

您以错误的方式保存zip文件,或者接收到的缓冲区包含格式错误的数据。尝试这样保存文件,而不是file_put_contents():

<?PHP
    $handle = fopen('temp/soubor.zip', 'w');
    fwrite($handle, base64_decode($zipdatabase64));
    fclose($handle);
?>