2

私はオンライン請求書システムを使用しており、その API を使用すると、base64 でエンコードされた圧縮された pdf である文字列の形式で PDF 請求書をダウンロードできます。この文字列を base64_decode() でデコードし、ファイルとして保存します。file_put_contents('temp/soubor.zip', $data);

このzipファイルをWindowsで開きたい場合は、問題ありません。しかし、私は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 である size を除いてすべて問題ありません。何も抽出されないため、これは大きな問題です。

そして興味深いことに、zip ファイルを winRar で開き、修復アーカイブを選択し、スクリプトで修復された 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 に答える