Как установить длину содержимого как длинное значение в заголовке HTTP в java?

Я пишу веб-сервер в 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, чтобы я мог установить длину содержимого как долгое значение.

Ответ 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 ГБ.