2011-06-28 14 views
0

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 
+0

コードの一部を表示してください。また、OS X Unzipperは何を出力していますか? –

+0

私が言及したように、OSXのunzipperは、「抽出に必要なバージョン」フィールドに応じて、.cpgzファイルまたはエラーを出力します。コードは非常に長く、特定の部品を見たいと思いますか? – JWood

+0

'ZipStream-> finish()'を呼び出していますか? – mikerobi

答えて

1

へ私自身の質問に答えてください、問題はOSXは2つのことが好きではないということです。 1)ディレクトリレコードの最後に追加のメタデータ(サイズ、CRCなど)を追加する必要がありますが、これは厳密には必要ではありません(仕様内)。 2)保存方法0x00(store)をサポートしていないので、ファイルはOSX unarchiverで開くために少なくともDEFLATEDでなければなりません。

0

、このISNサーバー/コードの問題が発生します。

https://discussions.apple.com/thread/1446784?start=0&tstart=0

http://www.google.co.uk/#sclient=psy&hl=en&safe=off&biw=1436&bih=784&source=hp&q=cpgz&aq=f&aqi=g3g-s1g1&aql=&oq=&pbx=1&bav=on.2,or.r_gc.r_pw.&fp=c131ccfc5fe21e40

多くの人がこの問題を抱えています。

OSXは私のために解凍しません。エラー:操作は許可されていません。ターミナルを使って手動で解凍する必要がありました。

ターミナルを使用して解凍すると、出力を表示できますか?

unzip test.zip -d test

シャミル・Nunhucks-のMacBook - エア:ダウンロードシャミル$解凍test.zip -dテスト アーカイブ:test.zip が作成:テスト/テスト/ 作成:テスト/テスト/新しいフォルダを/ 抽出:test/test/onebit_42.png

//スレッドはスーパーユーザーに移動しないでください。

あなたが使用する必要が=============================

ob_start('ob_gzhandler') 
+0

私はそれらのリンクを見て、私はそれを丸める方法がなければならないと確信しています。OSXのunarchiverは、明らかにディレクトリレコードの解釈がより厳密ですが、ストリームされたZIPファイルを処理できることは確かです。 – JWood

+0

私はちょうど私の答えを更新しました。私があなたに与えたコマンドの出力を投稿できますか? – bear

+0

アーカイブ:Test.zip 作成中:test/Test/ 作成:test/Test/Newフォルダ/ 抽出:test/Test/onebit_42.png – JWood

関連する問題