【问题标题】:How to set content length as long value in http header in java?java - 如何在java的http标头中将内容长度设置为长值?
【发布时间】:2012-07-13 02:13:43
【问题描述】:

我正在用 java 编写一个 Web 服务器,它可以传输高达 2GB 的文件。当我搜索原因时,我发现像 java HttpServelet 只允许我们将内容长度设置为 int。由于整数的最大大小为 2GB,当我使用 response.setContentLength 方法时,它的工作正常可达 2GB。现在问题是默认情况下 response.setContentLength 具有整数参数。所以它不以长值作为参数。我已经试过了 response.setHeader("内容长度", Long.toString(f.length())); response.addHeader("内容长度", Long.toString(f.length())); 但没有任何工作。当它是一个长值时,它总是无法添加内容长度。所以请给 HTTPServletResponse 任何可行的解决方案,以便我可以将内容长度设置为长值。

【问题讨论】:

标签: java


【解决方案1】:

试试这个:

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

希望这会有所帮助...

【讨论】:

  • 其实我也试过了。但是每当长值到来时,它将内容长度设置为 0..
  • 这很奇怪 - 你能试试response.setHeader("Content-Length", String.valueOf(1048576)) 并再次检查 HTTP 响应吗?
  • 很好,这在 Tomcat7 中有效。 setContentLength((int)len) 打破了我的 VLC 播放器的 206-partialcontent 视频流。作为字符串的值起到了作用。如果这有什么不同的话,我在 servlet url 上没有任何 pre+postprocess 过滤器。
【解决方案2】:

您也可以使用下面的示例代码。

long length = fileObj.length();

if (length <= Integer.MAX_VALUE)
{
  response.setContentLength((int)length);
}
else
{
  response.addHeader("Content-Length", Long.toString(length));
}

【讨论】:

  • 你真的试过这个,还是只是猜测?
  • @EJP,标头名称是正确的“Content-Length”,w3c ref 中没有大小限制,那是什么意思?某些浏览器无法处理较长的内容长度 - 正如 Yura 回答的评论中所说的那样?
【解决方案3】:

根本不要设置它。

让它使用默认的分块传输模式。在这种情况下没有 Content-Length 标头。请参阅@BalusC 在this question 下的评论。

【讨论】:

    【解决方案4】:

    不要设置它并使用分块编码。还要注意 HEAD 请求 = 这些请求应该返回与 GET 相同的内容长度,但不发送实际的正文。 javax.servlet.http.HttpServletHEAD 的默认实现是通过在同一 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 调用以节省生成巨型文件的时间)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多