1

UnixのzipコマンドとPHPのパススルー関数を使用してzipストリーミングソリューションをまとめようとしていますが、問題が発生しました。

スクリプトは次のようになります。

<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachement; filename=myfile.zip");
passthru("zip -r -0 - /stuff/to/zip/");
exit();
?>

zipコマンドは正常に機能し、出力はブラウザによって受信され、zipファイルとして保存されます。その後、zipはWindowsおよびUnixで正常に抽出できますが、Mac OS Xでは、ビルドインエクストラクタ(BOMArchiveHelper)はファイルを抽出できません。ただし、OSXで他のアプリケーションを使用しても問題なく動作します。

BOMArchiveHelperによって提供されるエラーは、zipがパスワードで保護されている場合(アプリケーションによって処理されない場合)と同じです。ある種のzipアナライザープログラムを使用しましたが、zipアーカイブ内の一部のファイルにパスワードで保護されたフラグが設定されていることが示されました。私が言ったように、他の抽出アプリケーションは明らかにそれに注意を払っていません。

zipを詳しく調べてみると、PHPファイルによって生成されたものは、サーバー上のzipコマンドによって直接生成されたものよりも数バイト大きいことがわかりました。パススルーを使用したスト​​リームプロセスにより、ファイルに何かが追加され、BOMArchiveHelperで問題が発生する可能性があります。

これをテストするために、passthruを使用して、サーバー上にすでに作成したzipをストリーミングしました。passthru( "cat stuff.zip")これはBOMArchiveHelperで正常に機能しました。

したがって、問題は、passthru関数がzipコマンドによってオンザフライで生成されたバイナリデータを取得し、それをブラウザに渡すプロセスのどこかにあるようです。

余分なバイトが生成される可能性のあるすべてのソースを削除しようとしましたが(zipコマンドをquietに設定するなど)、追加されたデータはまだ残っています。ストリーミングされたzipと事前に生成されたzipのバイナリ差分は、余分なデータが最後や最初だけでなく、zip全体に散在していることを示しています。

誰かが手がかりを持っているか、以前にこの問題を見て、解決するのは不可能だと判断しましたか?

NB:他の誰かがすでにこの問題に遭遇し、何の答えもなくこの問題を非常によく説明しているので、私は彼のメッセージをここにコピーして貼り付け、彼のすべてのテストが効果的に失敗し、私のいずれも合格しなかったことを確認しました...

どうやらこれを機能させる唯一の方法は、解凍またはsuffitexpanderのいずれかを使用するように人々に依頼することです...

4

1 に答える 1

0

nginxを使用している場合は、http: //wiki.nginx.org/NginxNgxZipをご覧ください。

于 2010-09-11T06:22:55.413 に答える