2009-04-05 7 views
1

Я пытаюсь загрузить файл с моего приложения Java. Но поскольку UrlConnection использует протокол HTTP 1.1, я получаю Transan Encoding: chunked response, и в этом случае я не могу узнать размер файла (длина контента не задана). Из того, что я мог найти, HTTP-версия жестко закодирована в классе, и нет возможности ее изменить. Можно ли как-то изменить версию на один или сказать серверу, чтобы не использовать закодированную кодировку при отправке файла?Java UrlConnection HTTP 1.0

Редактировать: Я не пытаюсь получить динамический контент, мое приложение является менеджером загрузки. Файлы, загружаемые мной, являются статическими. Другие загрузчики, которые я проверил wget, igetter, curl, используют Http 1.0, и они получают информацию о размере с большинства серверов. Но мое приложение и firefox, выпускающие Http 1.1, всегда получают закодированное кодирование. Я понимаю, что длина контента не всегда присутствует, но я хотел бы получить ее большую часть времени.

ответ

0

Два способа я могу думать:

  • Использование HTTPClient вместо UrlConnection, но вам нужно установить параметр HTTPClient.forceHTTP_1.0=true для обеспечения выполнения HTTP1.0
  • Использование TCP сокет и реализации HTTP поверх него (не так сложно). Я бы лично пошел с этим решением: P
+0

Я согласен с heepClient .. –

3

Очень вероятно, что сервер не может указать допустимую длину содержимого, даже если вы укажете HTTP/1.0. Когда контент динамически создается, сервер должен буферизировать все это, чтобы измерить его общую длину. Не все серверы смогут отказаться от этого менее эффективного поведения.

Если буферизация ответа разумна, почему бы не сделать это в своем клиенте, где у вас есть полный контроль? Это безопаснее, чем полагаться на сервер.

Прочитайте ответ без обработки, просто набив данные в ByteArrayOutputStream. Когда вы закончите, измерьте длину полученного массива байтов. Затем создайте с ним ByteArrayInputStream и обработайте этот поток вместо потока, который вы получили от URLConnection.

Смежные вопросы