2

我正在使用在线发票系统,他们的 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 文件,我会得到正确的大小并且可以正确提取文件。顺便说一句,存档文件只有 260kB。

4

2 回答 2

1

看起来像格式错误的存档,可能它是从大小未知的数据流“即时”构建的,并且并非所有 ZIP 数据包都正确写入输出(或者,流未刷新,因此未写入中央目录)。您可以通过运行 zipinfo 查看详细的 zip 文件信息:http: //www.info-zip.org/mans/zipinfo.html

于 2013-01-22T19:12:20.540 回答
0

要么您以错误的方式保存您的 zip,因此接收到的缓冲区包含格式错误的数据。试试这个哟保存你的文件而不是 file_put_contents():

<?PHP

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

?>
于 2013-01-21T15:12:10.877 回答