2010-06-06 4 views
31

Ich muss eine Datei herunterladen und ich verwende this code, die im Grunde eine AsyncTask ist, die eine Fortschrittsanzeige aktualisieren soll. Aber da ich nicht weiß, wie groß die Datei ist, musste ich den Fortschrittsbalken des Spinner verwenden. Also, wie bekomme ich die Dateigröße, bevor ich sie herunterlade, damit ich einen normalen Fortschrittsbalken benutzen kann?Wie kann man die Größe einer Datei vor dem Herunterladen erkennen?

+0

Beachten Sie, dass Sie 'urlConnection.connect()' aufrufen sollten, bevor Sie versuchen, auf den 'Content-Length'-Header zuzugreifen. Das könnte nicht funktionieren, aber nicht unter allen möglichen Umständen. – Felix

+0

Wusste nicht, dass ... es so für mich funktioniert hat, aber danke für deinen Rat. Ich werde die Antwort bearbeiten. – Cristian

Antwort

69

Sie können eine Kopfzeile mit dem Namen Content-Length Form des HTTP-Response-Objekts erhalten, die Sie erhalten, wird Ihnen die Länge der Datei geben. Sie sollten jedoch beachten, dass einige Server diese Informationen nicht zurückgeben, und die einzige Möglichkeit, die tatsächliche Größe kennen, ist alles aus der Antwort zu lesen.

Beispiel:

URL url = new URL("http://server.com/file.mp3"); 
URLConnection urlConnection = url.openConnection(); 
urlConnection.connect(); 
int file_size = urlConnection.getContentLength(); 
+0

Dies funktioniert in den meisten Fällen, aber wenn die Datei zu groß ist, wird es nicht funktionieren. Siehe meinen Beitrag unten für eine Lösung, die immer funktioniert: http://stackoverflow.com/a/12271781/878126 –

+0

Sie sollten getContentLengthLong() anstelle von getContentLength() für Android 7 und höher verwenden. Darunter bevorzugen Sie die Verwendung von Long.parseLong (urlConnection.getHeaderField ("content-length")) – Sandeep

16

können Sie in der Regel getContentLength verwenden, aber das Beste, was es ist, die Länge von sich selbst zu erhalten (da es ganze Zahl von Maximalwert umgehen kann).

Parsen Sie einfach den Content-Length-Header-Wert selbst. besser parse es so lange.

Beispiel:

final URL uri=new URL(...); 
URLConnection ucon; 
try 
    { 
    ucon=uri.openConnection(); 
    ucon.connect(); 
    final String contentLengthStr=ucon.getHeaderField("content-length"); 
    //... 
    } 
catch(final IOException e1) 
    { 
    } 

Sie beachten Sie, dass ich eine beliebige Zeichenfolge sein kann, so versuchen Sie fangen verwenden, und wenn es -1, leer oder null, es bedeutet, dass Sie nicht die Größe der wissen kann, Datei, da der Server es nicht erlaubt.

+1

Java-Int-Primitive ist eine 32-Bit-Ganzzahl mit Vorzeichen; Sie werden wahrscheinlich nicht den Maximalwert mit einem Content-Type-Header – mjama

+4

tatsächlich überschreiten können, es ist etwa 2 GB. –

+0

Also, was auf der Serverseite zu tun, um es zu ermöglichen ..? –

Verwandte Themen