Класс Android URLConnection не может получить контент, используя интернет-соединение 3G - PullRequest
0 голосов
/ 29 ноября 2011

У меня есть следующий фрагмент кода:

URL url = new URL("http://myserver.com/getFile.php");
URLConnection conexion = url.openConnection();
conexion.connect();
int lenghtOfFile = conexion.getContentLength();

Все работает, пока я не работаю с подключением WiFi.Если я попытаюсь запустить этот код, когда доступно только соединение GPRS / 3G, conexion.getContentLength() вернет -1.

Любая идея, почему?

РЕДАКТИРОВАТЬ: я проверил заголовки, используя getHeaderFields().Они разные, если я использую сеть 3G.В этом случае Content-Length в этом случае отсутствует.Есть идеи, почему сервер возвращает разные заголовки?Я не использую какой-либо специальный скрипт для предоставления файла, я получаю только файл, который находится в указанном месте.

Весь заголовок для случая WiFi:

{Accept-Ranges = [байт], Connection = [Keep-Alive], Content-Length = [628254], Content-Type = [text / plain;charset = UTF-8], Date = [вторник, 29 ноября 2011 г. 11:22:50 GMT], ETag = ["7a0c7-9961e-4af3f38778500"], Keep-Alive = [timeout = 15], Last-Modified = [Пт, 14 октября 2011 г. 09:52:52 GMT], Сервер = [Apache / 2.2.9 (Debian) PHP / 5.2.6-1 + lenny9 с Suhosin-Patch mod_python / 3.3.1 Python / 2.6.6 mod_ssl / 2.2.9 OpenSSL / 0.9.8o mod_wsgi / 3.3 mod_perl / 2.0.4 Perl / v5.10.0]}

Весь заголовок для случая при использовании 3G:

{Accept-Ranges = [байты], Connection = [Keep-Alive], Content-Type = [text / plain;charset = UTF-8], Date = [вторник, 29 ноября 2011 г. 11:20:33 GMT], ETag = ["7a0c7-9961e-4af3f38778500"], Keep-Alive = [timeout = 15], Last-Modified = [Пт, 14 октября 2011 г. 09:52:52 GMT], Сервер = [Apache / 2.2.9 (Debian) PHP / 5.2.6-1 + lenny9 с Suhosin-Patch mod_python / 3.3.1 Python / 2.6.6 mod_ssl / 2.2.9 OpenSSL / 0.9.8o mod_wsgi / 3.3 mod_perl / 2.0.4 Perl / v5.10.0], Transfer-Encoding = [chunked], Warning = [214 warkaz-fe07 "Преобразование применено"]}

Ответы [ 3 ]

1 голос
/ 29 ноября 2011

Вы уверены, что сервер предоставляет длину контента, отправляя заголовок Content-Length в ответе?

Из заголовков ясно, что у вашего провайдера есть какой-то прокси, который выполняет преобразование,удаление содержимого длины в процессе.Заголовок предупреждения ясно указывает на это.Вы можете попытаться вернуть другой тип контента (теперь вы получаете текст / обычный текст), возможно, этот конкретный прокси не будет его трогать.Конечно, это не очень удачное решение, ведь операторам, возможно, придется как-то «оптимизировать» свою сеть.

Вы также можете попробовать запрос HEAD, используя заголовок диапазона, чтобы получить приблизительный контент.размер.В этом случае вы бы предположили несколько диапазонов, таких как 100k, 1000k и т. Д., Чтобы увидеть, считает ли сервер приемлемый диапазон.Вы можете использовать этот поддельный диапазон для вашего прогресса.Опять же, это не очень хорошее решение, но если вам действительно нужен прогресс, это что-то, что нужно попробовать.

В конце концов, лучше просто показать прогресс как неизвестный, если длина неизвестна.

0 голосов
/ 29 ноября 2011

Возможно, это связано с ограничениями вашего оператора. Старайтесь не нуждаться в этом значении. (например, читая inputStream до тех пор, пока вы не сможете его прочитать).

0 голосов
/ 29 ноября 2011

Так как вы используете

new URL("http://myserver.com/getFile.php");

Полагаю, вы используете настроенный вами персональный сервер, и при использовании WiFi ваш телефон находится в локальной сети и, следовательно, может видеть ваш сервер, но когда вы пытаетесь подключиться через GPRs / 3G, вы пытаетесь получить доступ к локальному серверу из Интернета.

...