0

私は 2 つの異なるサーブレットを持っています。どちらも POST 呼び出しを処理しており、結果としてファイルをストリーミングしています。1 つは常に Content-Length ヘッダーで終わりますが、もう 1 つは決してありません。どちらも javax.servlet.http.HttpServletResponse を使用します。

どちらも "Content-Type" = "application/octet-stream" を設定します。

この違いを引き起こすために何ができるかを理解できませんでした。

処理で見られる唯一の実際の違いは、Content-Length を取得しないファイルのサイズは通常数 MB であり、もう 1 つは通常わずか数 KB であることです。

念のため、response.AddHeader("thing", size) を使用してみましたが、そのヘッダーがどちらのサーブレットにも表示されないことに気付きました。

OS/X マシンでファイルを受信し、[NSHTTPURLResponse allHeaders] を使用して応答ヘッダーを確認していることに注意してください。

これは、大幅に削減されたコードです。基本的に、応答を参照したものだけを保持しました。

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("application/octet-stream");
    resp.setBufferSize(256 * 1024);
    OutputStream rout = resp.getOutputStream();
// lots of work getting the stream
// Also left out all the exception handling and error checking
    IOUtils.copy(datafile, rout);
    rout.close();
    resp.addIntHeader("OnDeck-Test", 555);
  }
4

1 に答える 1

0

そして、私はDOHを持っていました!数分後の瞬間。もちろん、巨大なファイルが完全にストリーミングされる前に Content-Length を設定することはできません。また、断片的にストリーミングされるため、応答を受信したときにコンテンツの長さがわかりません。addIntHeader() が機能しない理由は、ファイルがストリーミングされた後に実行されたため、応答がずっと前に送信されたためです。

于 2013-09-20T04:45:39.380 に答える