Я пишу веб-сервер в Java, который передает файл до 2GB штрафа. Когда я искал причину, я нашел, что java HttpServelet позволяет нам устанавливать длину содержимого как int. Поскольку максимальный размер целого составляет 2 ГБ, его работая отлично до 2 гб, когда я использую метод response.setContentLength. Теперь проблема заключается в ответе от ответа. SetContentLength имеет параметр integer. Поэтому он не принимает значение long в качестве параметра. Я уже пробовал response.setHeader( "Content-Length", Long.toString(f.length())); response.addHeader( "Content-Length", Long.toString(f.length())); но ничего не работает. Все время он не может добавить длину контента, когда он является длинным значением. Поэтому, пожалуйста, дайте любое рабочее решение для HTTPServletResponse, чтобы я мог установить длину содержимого как долгое значение.
Как установить длину содержимого как длинное значение в заголовке HTTP в java?
Ответ 1
Вы также можете использовать примерный код.
long length = fileObj.length();
if (length <= Integer.MAX_VALUE)
{
response.setContentLength((int)length);
}
else
{
response.addHeader("Content-Length", Long.toString(length));
}
Ответ 2
Попробуйте следующее:
long length = ...;
response.setHeader("Content-Length", String.valueOf(length))
Надеюсь, что это поможет...
Ответ 3
Не устанавливайте его вообще.
Просто позвольте ему использовать режим передачи по каналам, который является значением по умолчанию. В этом случае заголовка Content-Length нет. См. Комментарий @BalusC в этом вопросе.
Ответ 4
Не устанавливайте его и не используйте закодированную кодировку. Также будьте осторожны с запросами HEAD= эти запросы должны возвращать ту же длину содержимого, что и GET, но не отправляют фактическое тело. Реализация по умолчанию HEAD в javax.servlet.http.HttpServlet выполняется путем вызова GET по одному и тому же URL-адресу и игнорирования всего тела ответа, написанного (только для подсчета символов) - см. следующий фрагмент:
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 также для экономии времени, создавая гигантский файл).
Ответ 5
Подобно массивам в java, в вашей ситуации вы не можете иметь более 2 ГБ.