2

私は Web ページで次のことを行っています: 要素をクリックすると、(要素に添付された) データのセットがサーバーに送信され、カスタム zip ファイルが生成されます。

$.post(urlprefix + 'makeZip.php', params, function(data){
    window.location = urlprefix + 'getZip.php?file=' + data; //get file
}).error(handleAJAXError);

makeZip.php正常に動作し、クライアントがダウンロードする必要がある (一時的な) zip ファイルの名前を返します。サーバーをきれいに保ちたいのでgetZip.php、次のことを行う別のスクリプトを介してファイルをルーティングします。

/* RETURN REQUESTED FILE AND DELETE FROM SERVER*/
$filename = $_GET['file'];
/* TRANSFER FILE CONTENTS */
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="customDownload.zip"');
header('Content-Length: '.filesize($filename));
readfile($filename);
/* REMOVE FILE FROM SERVER */
unlink($filename);

すべてのブラウザはファイルを正常にダウンロードしますが、1 つの問題に直面しています。ファイルがかなり大きくなる可能性があるため (最大 200MB)、ダウンロードにかかる時間を見積もるとよいと思います。そのため、Content-Lengthヘッダーを送信しています(指定されたファイルサイズは正しいです)。それでも、私がテストしたすべてのブラウザーは、ファイルサイズが不明であることを示しています (これにより、ユーザーがダウンロードをスキップする可能性があります)。

これは私のヘッダー情報に何らかの問題がありますか? クライアント側の問題ですか?クライアントにファイルをダウンロードさせるには、別の方法を使用する必要がありますか?

4

1 に答える 1

6

クライアントが readfile 経由で提供されたファイルをダウンロードするときにダイアログに「不明なファイルサイズ」を表示する場合は、 がサーバーにインストールされているかどうかを確認mod_deflatemod_gzipmod_something-that-shrinks-http特定のダウンロードに例外を設定することをお勧めします。

詳細はこちら

m90による編集:

私の特定のケース(Apacheを実行している)では、次を使用して縮小をオフにしました。

@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);

Filesize ヘッダーがすべてのブラウザで正しく送受信されるようになりました

于 2012-09-17T10:46:05.820 に答える