2015-10-07 7 views
0
АПК

Я использую следующий код для загрузки файла в моем Android проекта:Android getContentLength всегда возвращает -1 при загрузке файла

URL url = new URL(fileUrl); 
URLConnection conection= url.openConnection(); 
conection.setDoOutput(true); 
conection.connect(); 
int lenghtOfFile = conection.getContentLength(); 

Если fileUrl является APK, lenghtOfFile всегда возвращает -1.
Но если это изображение, тип видео, ... lenghtOfFile возврат точно.

Почему?

Я использую затмение, Android SDK пересмотра 23.

+0

Возможно, это проблема с внутренней защитой – Blackbelt

+0

, подтвердили ли вы, что файл действительно существует и что сервер фактически возвращает длину содержимого для него? – Sebastian

+0

длина файла должна обрабатываться сервером. ваш сервер не предоставляет этого. – hasan83

ответ

4

Длина содержимого не всегда доступна, так как по умолчанию запроса Android GZIP сжатый ответ. Источник: Android documentation.

Цитируя ссылку:

По умолчанию этой реализации HttpURLConnection запросов, которые серверов используют сжатие GZIP и автоматически распаковывает данные для вызывающих getInputStream(). В этом случае очищаются заголовки ответа Content-Encoding и Content-Length. Gzip сжатия можно отключить, установив приемлемые кодировки в заголовке запроса :

urlConnection.setRequestProperty("Accept-Encoding", "identity");

Установка хедер Accept-Encoding запрос явно отключает автоматическую распаковку и оставляет заголовки ответа нетронутыми; вызывающие абоненты должны обрабатывать декомпрессию по мере необходимости, в соответствии с заголовком ответа от Content-Encoding.

getContentLength() возвращает количество переданных байт и не может быть использован для прогнозирования, сколько байт может быть считана из getInputStream() для сжатых потоков. Вместо этого прочитайте этот поток до тех пор, пока он не будет исчерпан, то есть когда read() возвращает -1.

Независимо от того, действительно ли сжимается ответ, зависит от сервера.

+0

Отлично. Работайте как шарм. Спасибо вам большое <3 –

+0

Отлично .. Сэкономьте много времени .. –

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

  • Нет связанных вопросов^_^