PHPからZIPファイルをストリーミングするクラスを作成しています。ストリーミングZIPファイルがOSXで開かない
WinRAR、Windowsの圧縮フォルダ、BetterZipなどで開くと出力が正常になりますが、OSX Unarchiverで開くときは、.cpgzファイルだけです。
私はZIP仕様を何度も読んだことがあり、ヘッダーに対してクロスチェックしていて、すべてがうまく見えます。私はここで同じ問題を抱えていると思われる別の質問を見つけましたが、解答は "0x0014にした"抽出フィールドを変更することでした。解凍しようとすると "操作が許可されません"というエラーが出ます。
私はここに内部フォルダや小さな画像とサンプルのzipファイルをアップロードしました:ここ
http://www.freefilehosting.net/test_97
は、コードがどのように動作するかです:興味深いことに
// File entry header
echo pack('V', 0x04034b50);
echo pack('v', 0x0014); // Version needed to extract
echo pack('v', $dir ? 0 : 0x0808); // General purpose bit flag for unknown CRC
echo pack('v', 0x00); // Compression method (store)
echo pack('V', $dts); // DOS timestamp
echo pack('V', 0x00); // CRC - empty
echo pack('V', 0x00); // Compressed data length
echo pack('V', 0x00); // Decompressed data length
echo pack('v', strlen($filename)); // Length of filename
echo pack('v', 0x00); // Length of additional data
<snip>Output raw file data</snip>
// File entry trailer
echo pack('V', 0x08074b50); // Magic
echo pack('V', $crc); // CRC generated using crc32b algo
echo pack('V', $data_size); // Compressed size
echo pack('V', $total_size); // Uncompressed size
// CDR record
echo pack('V', 0x02014b50); // Magic
echo pack('v', 0x0014); // Version created by
echo pack('v', 0x0014); // Version req'd to open
echo pack('v', 0x00); // General purpose bit
echo pack('v', 0x00); // Compression method (store)
echo pack('V', $dts); // DOS timestamp
echo pack('V', $crc); // CRC of data
echo pack('V', $data_size); // Compressed size
echo pack('V', $total_size); // Uncompressed size
echo pack('v', strlen($filename)); // Filename length
echo pack('v', 0x00); // Extra data length
echo pack('v', 0x00); // Comment length
echo pack('v', 0x00); // Start disk no.
echo pack('v', 0x00); // Internal file attributes
echo pack('V', $dir ? 16 : 32); // External file attributes
echo pack('V', $offset); // Relative offset
// End of file record
echo pack('V', 0x06054b50); // Magic
echo pack('v', 0x00); // Current disk number
echo pack('v', 0x00); // Disk containing CDR
echo pack('v', $count); // Number of entries in this CDR
echo pack('v', $count); // Total number of CDR entries
echo pack('V', $cdr_len); // Length of CDR
echo pack('V', $cdr_offset); // Offset of CDR
echo pack('v', 0x00); // Zip file comment length
コードの一部を表示してください。また、OS X Unzipperは何を出力していますか? –
私が言及したように、OSXのunzipperは、「抽出に必要なバージョン」フィールドに応じて、.cpgzファイルまたはエラーを出力します。コードは非常に長く、特定の部品を見たいと思いますか? – JWood
'ZipStream-> finish()'を呼び出していますか? – mikerobi