Длина содержимого Android HttpURLConnection

Я пытаюсь загрузить файлы с сервера в Android и показать диалоговое окно прогресса, используя код, очень похожий на ответ предоставлен в этой теме, но я не могу получить длину содержимого в методе getContentLength() HttpURLConnection. Длина содержимого для всех файлов равна -1.

Для того же файла я получаю правильную длину содержимого в приложении iOS с помощью метода NSHTTPURLResponse expectedContentLength.

Есть ли какая-то принципиальная разница в том, как эти методы извлекают длину содержимого для http-соединения/ответа?

ИЗМЕНИТЬ 1:

Пробовал следовать нескольким вещам, как предложил некоторые ответы и комментарии.

  1. Установите заголовок Accept-Encoding на identity
  2. Извлечение длины содержимого в виде строки (из поля заголовка Content-Length), а затем преобразование ее в длинную
  3. Пробовал conn.getContent().toString().length() вместо getContentLength()

Ни один из них не работал для меня еще.

Что меня больше всего сбивает с толку, так это то, что я получаю длину контента в iOS, но не на Android.

РЕДАКТИРОВАТЬ 2:

Вот мой код iOS и Android для сравнения -

iOS:

NSURLRequest *request = [NSURLRequest requestWithURL:self.url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:1200.0];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];

Андроид:

URL url = new URL(downloadUrlString);
connection = (HttpURLConnection) url.openConnection();
connection .setRequestProperty("Accept-Encoding", "identity");
connection.connect();

Единственная разница, которую я вижу, это кеширование. Поэтому я добавил следующую строку в код Android, но ничего не изменилось.

connection.setUseCaches(true);

person Swapnil Luktuke    schedule 04.03.2014    source источник
comment
Проверьте этот ответ stackoverflow.com/a/2294899/719212   -  person R4j    schedule 04.03.2014
comment
@ R4j я проверил ссылку. Я пробовал, но это не сработало. Ответ в этой ссылке более действителен для httprequests, которые возвращают правильную длину содержимого, но слишком велики для int. Я не получаю никакой длины контента.   -  person Swapnil Luktuke    schedule 04.03.2014
comment
В зависимости от веб-сервера, протокола, соединения или метода загрузки Content-length может быть не всегда доступен. Но в вашем случае, я думаю, вы должны сделать запрос, как это делает ios (проверьте свой заголовок, тип контента...). Или, может быть, вы должны предоставить свой код ios, тогда люди смогут вам помочь.   -  person R4j    schedule 04.03.2014


Ответы (3)


попробуй это:

   HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   conn .setRequestProperty("Accept-Encoding", "identity");
   conn.connect();
person MengMeng    schedule 04.03.2014
comment
Работал на меня!!! В моем случае это была проблема с обновлением сервера, когда сервер не отправлял заголовок длины содержимого, когда кодировка была gzip. - person deko; 04.03.2015

если вам просто нужна длина контента, вы можете попробовать

  conn.getContent().toString().length()

где conn — это объект HttpURLConnection.

person Mina Tadros    schedule 04.03.2014
comment
При таком подходе я также получаю -1 в качестве длины контента. - person Swapnil Luktuke; 04.03.2014
comment
это означает, что длина контента отсутствует, я думаю, что ваша проблема не в длине контента. Это способ подключения. Как вы упомянули, вы получили файл по ISO и прочитали содержимое. Это означает, что вы забыли установить что-то в заголовке перед подключением или что-то установили неправильно. - person Mina Tadros; 04.03.2014

Основной причиной этой проблемы оказались файлы cookie.

Я использую веб-представление в одном из действий в своем приложении. Некоторые файлы cookie сохраняются веб-представлением. Все другие REST API и запросы на загрузку файлов работают без этих файлов cookie, однако для запросов определенного типа файлы cookie необходимы.

По-видимому, веб-просмотр Android и запросы на подключение не используют файлы cookie из коробки, как iOS. В результате мне пришлось внести изменения в свой код, чтобы убедиться, что HttpUrlConnection использует хранилище файлов cookie WebKit. Я сделал это, используя метод , описанный в принятом ответе. на этот вопрос.

person Swapnil Luktuke    schedule 09.03.2014