3

ファイルをダウンロードするためのダウンロード サーブレットで問題に直面しています。

httpResponse.getOutputStream() から出力ストリームを取得し、
この出力ストリーム オブジェクトを別のクラスである FileOperations に渡しました。
この FileOperations は、新しいスレッドとして呼び出されます。ファイルを出力ストリームに書き込んでフラッシュすると、ファイルを正しく保存するためにポップアップが表示されますが、ファイルを
保存して開くと、最初の行が次のように表示されます。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
Date: Mon, 11 Jun 2012 14:19:37 GMT
2000

この後、ファイルの内容が書き込まれ、数行後に再び「2000」が書き込まれます。

ダウンロードをスレッド モードで実行するにはどうすればよいか教えてください。

スレッドを呼び出さずにファイルをダウンロードしようとしたところ、正しくダウンロードされました。
ServletOutputStream の代わりに FileOutputStream をスレッドに渡しましたが、それも適切にダウンロードされました。

4

1 に答える 1

2

サーブレット メソッドからの現在の HTTP 要求スレッドの外に HTTP 応答を渡してはなりません。サーブレット メソッドが戻ると (スレッドがまだバックグラウンドで実行されている間に)、コンテナはすぐに応答を送信します。

他のスレッドに委譲すると、ダウンロードは速くなりません。現在の HTTP 要求は、専用スレッドによって既に処理されています。このアプローチを忘れて、現在の HTTP 要求スレッドでストリーミング ジョブを実行することをお勧めします。これにより、アプリケーションは不要なスレッドを作成する必要がなくなり、リソースの消費が増えるだけです。

ダウンロード速度を向上させるには、Rangeリクエストをサポートするようにサーブレットを再設計することをお勧めします。このようにして、クライアントは自動的に、または特定のブラウザ プラグインを使用して複数のIf-Rangeリクエストを送信し、複数の HTTP 接続を物理的に使用してファイルを分割してダウンロードできます (したがって、サーバー側の複数の HTTP リクエスト/スレッド)。ただし、これはまったく簡単なことではありません。このブログ記事では、このようなサーブレットの具体的なキックオフの例を見つけることができます. このアプローチは理論的にはダウンロード速度を向上させる可能性がありますが、ネットワーク帯域幅の制限にまだ制限されていることに注意してください。クライアントの着信ネットワーク帯域幅がサーバーの発信ネットワーク帯域幅よりも広く、サーバー (または ISP!) が接続ごとに帯域幅を制限するように構成されている場合にのみ、高速になります。これは 90 年代には珍しくありませんでしたが、最近ではそれほど一般的ではありません。

于 2012-06-11T15:59:58.463 に答える