我正在使用在线发票系统,他们的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文件,或者接收到的缓冲区包含格式错误的数据。尝试这样保存文件,而不是file_put_contents():
<?PHP
$handle = fopen('temp/soubor.zip', 'w');
fwrite($handle, base64_decode($zipdatabase64));
fclose($handle);
?>