5

Ich versuche, die Größe des Inhalts einer URL zu erhalten mit:Android: URLConnection.getContentLength() falschen Wert zu geben

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); 

ich dies mit im doInBackground() eines AsyncTask und für einige Grund conn.getContentLength(); gibt 1273 zurück, wenn es 10136 zurückgeben sollte.

Ich habe den obigen Code innerhalb der Main einer regulären Java-Anwendung verwendet und conn.getContentLength(); gibt den richtigen 10136-Wert zurück.

Warum funktioniert es nicht in einem AsyncTask?

+0

Verwenden Sie Chunked Transfer Encoding von Ihrer Server-Seite? – axierjhtjz

Antwort

1

Die Beschreibung von .getContentLength() ist, dass es den Wert des Headerfelds Content-Length zurückgibt. Unter normalen Umständen sollte dies der Menge der verfügbaren Daten entsprechen, die gelesen werden können. Jedoch ...

(1) Die Kopfzeile möglicherweise nicht vorhanden, wenn Chunked-Codierung zum Senden der Daten verwendet wird. In diesem Fall gibt .getContentLength()-1 zurück, so dass dies hier nicht der Fall zu sein scheint.

(2) In der Standardeinstellung, die Umsetzung von HttpURLConnection Anfragen, die Server gzip Kompression verwenden, und es dekomprimiert die Daten automatisch für Anrufer von getInputStream(). Die Header für Inhaltscodierung und Inhaltslänge werden in diesem Fall gelöscht.

Der letzte Satz scheint darauf hinzudeuten, dass dies auch hier nicht der Fall ist, weil Sie nicht -1 von .getContentLength bekommen sind() `, aber die relativen Größen (1273/10136) machen mich stutzig ...

Ein Test hierfür wäre behinderte gzip-Codierung wird durch die zulässigen Codierungen in dem Anforderungs-Header-Einstellung mit:

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

andere, um den Netzwerkverkehr zu Beobachtern wären zu ‚snoop‘ die HTTP-Header, und die Menge der Daten nach Hinweisen .

BTW, url.openStream() ist ein Komfort für url.openConnection().getInputStream().