我正在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值。
答案 0 :(得分:11)
您还可以使用以下示例代码。
long length = fileObj.length();
if (length <= Integer.MAX_VALUE)
{
response.setContentLength((int)length);
}
else
{
response.addHeader("Content-Length", Long.toString(length));
}
答案 1 :(得分:5)
试试这个:
long length = ...;
response.setHeader("Content-Length", String.valueOf(length))
希望这会有所帮助......
答案 2 :(得分:0)
根本不要设置它。
让它使用分块传输模式,这是默认设置。在这种情况下没有Content-Length标头。请参阅@ {3}}下的@ BalusC的评论。
答案 3 :(得分: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 调用以节省生成巨型文件的时间)。
答案 4 :(得分:-2)
就像java中的数组一样,在你的情况下你不能超过2 GB。