15

ファイルを最大2GBまで転送するWebサーバーをJavaで作成しています。理由を調べてみると、java HttpServelet ではコンテンツの長さを int にしか設定できないようです。整数の最大サイズは 2 GB であるため、response.setContentLength メソッドを使用している場合は 2 GB まで問題なく動作します。問題はデフォルトでresponse.setContentLengthに整数のパラメータがあります。したがって、パラメーターとして長い値を使用していません。私はすでに response.setHeader("Content-Length", Long.toString(f.length())); を試しました。response.addHeader("Content-Length", Long.toString(f.length())); しかし、何も機能していません。長い値の場合、常にコンテンツの長さを追加できません。したがって、コンテンツの長さを長い値として設定できるように、HTTPServletResponse の実用的なソリューションを提供してください。

4

4 に答える 4

11

以下のサンプルコードも使用できます。

long length = fileObj.length();

if (length <= Integer.MAX_VALUE)
{
  response.setContentLength((int)length);
}
else
{
  response.addHeader("Content-Length", Long.toString(length));
}
于 2014-07-04T10:16:37.817 に答える
5

これを試して:

long length = ...;
response.setHeader("Content-Length", String.valueOf(length))

お役に立てれば...

于 2012-07-13T08:56:51.177 に答える
0

これを設定せず、チャンク エンコーディングを使用します。HEADリクエストにも注意してください= これらのリクエストはGETと同じ content-length を返す必要がありますが、実際の本文は送信しません。javax.servlet.http.HttpServletでのHEADのデフォルトの実装は、同じ URL でGETを呼び出し、書き込まれたすべての応答本文を無視する (文字数のみ) ことによって行われます。次のフラグメントを参照してください。

protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    NoBodyResponse response = new NoBodyResponse(resp); // mock response (not writing)
    doGet(req, response); // performs a normal GET request
    response.setContentLength(); // this uses INTEGER counter only
}

問題は、コンテンツの長さのカウンターも整数であることです。そのため、 doHeadメソッドもオーバーロードし、コンテンツの長さをまったく設定しないことをお勧めします (巨大なファイルを生成する時間を節約するために、 GET呼び出しも残しておくことをお勧めします)。

于 2014-10-07T10:37:26.233 に答える