2013-01-21 25 views
2

我使用的是在线发票系统,它们的API允许我下载PDF格式的发票,格式为以base64压缩pdf格式的字符串。 我用base64_decode()解码这个字符串,然后将它保存为文件:file_put_contents('temp/soubor.zip', $data);PHP zip文件提取 - 错误的条目大小

现在,如果我想在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文件,我得到正确的尺寸和文件可以被正确地提取。 btw存档文件只有260kB。

+0

如果您必须修复才能打开它。这听起来像原始存档是腐败或使用某种不寻常或不完整的。你确定这是zip,而不是像gzip? – datasage

+0

我不确定它是否真的被损坏。 WinRar非常强大,因此它会打开甚至轻微损坏的文件。看来数据没问题,只有php无法正确读取压缩文件的大小。该文件是ZIP64 – Mroz

+0

它也会检测到打开的gzip文件。你能读取文件的前4个字节并发布吗?它会帮助我确定文件的确切格式(魔术字节)。 – datasage

回答

0

要么你被保存拉链在接收缓冲区的好方法包含畸形数据。试试这溜溜保存文件,而不是file_put_contents的():

<?PHP 

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

?> 
1

貌似畸形的档案,很可能是“飞”从数据流与未知大小的身材,而不是所有的ZIP包被正确地写入到输出(或者,流不会刷新,因此不会写入中央目录)。 您可以通过运行zipinfo查看详细的zip文件信息:http://www.info-zip.org/mans/zipinfo.html