如何在java的http头中将内容长度设置为long值?

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

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

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

尝试这个:

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

希望这可以帮助…

根本不要设置它。

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

不要设置它并使用分块编码。 还要注意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调用以节省生成巨型文件的时间)。

就像java中的数组一样,在你的情况下你不能超过2 GB。