15

我正在用 Java 编写一个 Web 服务器,它可以传输高达 2GB 的文件。当我搜索原因时,我发现像 java HttpServelet 只允许我们将内容长度设置为 int。由于整数的最大大小为 2GB,当我使用 response.setContentLength 方法时,它可以正常工作到 2GB。现在问题是默认情况下 response.setContentLength 具有整数参数。所以它不以长值作为参数。我已经尝试过 response.setHeader("Content-Length", Long.toString(f.length())); response.addHeader("内容长度", 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

根本不要设置。

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

于 2014-09-03T07:19:59.417 回答
0

不要设置它并使用分块编码。还要注意HEAD请求=这些请求应该返回与GET相同的内容长度,但不发送实际的正文。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 回答