ウェブサイトからダウンロードするために、その場でzipアーカイブを作成しようとしています。これは、クライアントの最小限の労力で達成できる必要があります(たとえば、特別な解凍ユーティリティをインストールしないでください)。イベントのシーケンスは次のとおりです。
- たくさんのファイルが集められ/作成されます。
- PHP(v2.2)は、shell_exec()を使用してlinux zip(v2.31)を呼び出し、ファイルを単一のファイルにアーカイブします。
PHPは次のようにヘッダーを送信します(Apache v2.2.22経由)。
Content-Type: application/zip Content-Length: (whatever) Content-Disposition: attachment; filename="whatever.zip" Content-Transfer-Encoding: binary
PHPは、readfileを使用してファイルをブラウザーに送信します。
受信したzipファイルは、Ubuntuに付属のアーカイブマネージャーユーティリティを使用して問題なく開くことができます。ただし、Firefox(最近のバージョン)を使用してWindows 7にダウンロードし、通常のzipフォルダーとして開くと、ファイルが無効であると報告されます。
元のzipファイルとダウンロードされたバージョンを比較すると、ダウンロードされた両方のバージョンに、次のように16バイトのヘッダーが追加されていることがわかります。
2f3c 6f62 7964 0a3e 2f3c 7468 6c6d 0a3e
ただし、それ以外は同じです。
このヘッダーは間違いなく、Windowsでzipファイルが失敗する原因です。元のファイルがネットワーク共有を介して転送されたとき、Windowsは問題なくそれを開くことができました。
ヘッダーは他のダウンロードされたファイルに追加されていないようです(とにかくPDFではありません)。
私が最初に考えたのは、Apacheがストリームをgzipでエンコードしていることですが、関連するモジュールもインストールされていません(受信したヘッダーには圧縮については記載されていません)。同様に、.zip拡張子に明示的なasisハンドラーを追加しても効果はありませんでした。
あなたが与えることができるアドバイスや助けを事前に感謝します!