zipファイルを含むContent-Length
を送信するときにヘッダーを指定しないとどうなりますか?HttpServletResponse
いくつかのテストを行いましたが、ヘッダーはデフォルトで正しいファイル長に設定されているようです。これが常に起こることを確信できますか?についてのドキュメントを見つけることができるのはいつですか?
zipファイルを含むContent-Length
を送信するときにヘッダーを指定しないとどうなりますか?HttpServletResponse
いくつかのテストを行いましたが、ヘッダーはデフォルトで正しいファイル長に設定されているようです。これが常に起こることを確信できますか?についてのドキュメントを見つけることができるのはいつですか?
実際の応答コンテンツの長さが応答バッファー(通常は2KB(サーバーのmake / version / configによって異なります))に完全に収まる場合、コンテンツの長さのヘッダーが設定されます。ただし、実際の応答コンテンツの長さが応答バッファよりも大きいため、応答コンテンツの終わりに達するよりも早くフラッシュされる場合、サーブレットはチャンクエンコーディングで応答を送信し、コンテンツの長さを設定する試みを無視します。ヘッダ。
これは、とりわけjavadocがHttpServlet#doGet()
以下に引用されていることに言及されています。
..。
可能な場合は、(メソッドを使用して)Content-Lengthヘッダーを設定し
ServletResponse.setContentLength(int)
、サーブレットコンテナが永続的な接続を使用してクライアントに応答を返すことができるようにし、パフォーマンスを向上させます。応答全体が応答バッファー内に収まる場合、コンテンツの長さは自動的に設定されます。HTTP 1.1チャンクエンコーディング(応答にTransfer-Encodingヘッダーがあることを意味します)を使用する場合は、Content-Lengthヘッダーを設定しないでください。
..。
「通常の」エンコーディングでは、データは1つの連続したブロックとして送信されます。
actualContent
チャンクエンコーディングでは、データは次のようなチャンクで送信されます
part1LengthInHexadecimal
actualPart1Content
part2LengthInHexadecimal
actualPart2Content
part3LengthInHexadecimal
actualPart3Content
0
16進数の部分の長さは、データの次のチャンクの大きさをクライアントに示します(現在のチャンクの一部として次のチャンクを「誤って」解析しないようにするため)。最後に、クライアントはパーツを接着します。ちなみに、これは、最終的なコンテンツの長さが事前に不明であるという明らかな理由から、応答でGzipが使用された場合のデフォルトの動作でもあります。
ウィキペディアの例も参照してください。
ファイルのダウンロードでコンテンツの長さを省略すると、ユーザーエクスペリエンスでは、ファイルのダウンロードの進行状況が不明になることに注意してください。つまり、エンドユーザーにはファイルサイズと残りのバイト/時間の表示は表示されません。このユーザーエクスペリエンスが重要な場合は、コンテンツの長さを事前に設定する必要があります。これを行うには、最初にメモリ内のバッファ(たとえばnew ByteArrayOuputStream(bytes)
、または一時ファイル(たとえば、コンテンツの長さをまたはでFiles#createTempFile()
取得できるため)に書き込み、最後にその一時バッファ/ファイルを応答に書き込みます。bytes.length
file.length()