5

Próbuję uzyskać rozmiaru zawartości URL, używając:Android: URLConnection.getContentLength() daje niepoprawną wartość

URLConnection conn = null; 
URL url = null; 
url = new URL("https://dl.dropboxusercontent.com/u/90210205/Default.html"); 
conn = url.openConnection(); 
conn.connect(); 
InputStream in = new BufferedInputStream(url.openStream()); 
int fileSize = conn.getContentLength(); 
System.out.println("File size " + fileSize); 
while (in.read() != -1) { 
    i++; 
} 
in.close(); 
System.out.println("Read " + i + " bytes of a possible " + fileSize); 

używam tego w doInBackground() wystąpienia AsyncTask a dla niektórych powód conn.getContentLength(); powraca 1273, kiedy powinien powrócić 10136.

Użyłem powyższego kodu w głównym pliku zwykłej aplikacji Java, a conn.getContentLength(); zwraca prawidłową wartość 10136.

Dlaczego to nie działa w przypadku AsyncTask?

+0

Czy używasz Chunked Transfer Encoding od strony serwera? – axierjhtjz

Odpowiedz

1

Opis .getContentLength() polega na tym, że zwraca wartość pola nagłówka Content-Length. W zwykłych okolicznościach powinno to odpowiadać ilości danych, które można odczytać. Jednak ...

(1) Nagłówek może nie być obecny, jeśli do przesłania danych używane jest kodowanie klockowe. W tym przypadku .getContentLength() zwraca -1, więc wydaje się, że tak nie jest w tym przypadku.

(2) Domyślnie implementacja HttpURLConnection żąda, aby serwery używały kompresji gzip i automatycznie dekompresowała dane dla osób dzwoniących pod numerem getInputStream(). Nagłówki odpowiedzi na kodowanie treści i długość treści są w tym przypadku wyczyszczone.

ostatnie zdanie wydaje się wskazywać, że to też nie jest w tym przypadku, ponieważ nie otrzymujesz -1 z .getContentLength() `, ale rozmiary względne (1273/10136) mnie podejrzane ...

Jeden test to byłoby niepełnosprawnych kodowania Gzip ustawiając dopuszczalne kodowania w nagłówku żądania z:

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

Another byłoby „snoop” ruch sieciowy do obserwatora nagłówkach HTTP i ilości danych wskazówek .

BTW, url.openStream() to udogodnienie dla url.openConnection().getInputStream().

Powiązane problemy