2010-06-06 38 views
31

Tengo que descargar un archivo y estoy usando this code, que es básicamente un AsyncTask que está destinado a actualizar una barra de progreso. Pero, como no sé cuál es el tamaño del archivo, he tenido que usar la barra de progreso de la ruleta. Entonces, ¿cómo puedo obtener el tamaño del archivo antes de comenzar a descargarlo para poder usar una barra de progreso normal?¿Cómo saber el tamaño de un archivo antes de descargarlo?

+0

Tenga en cuenta que debe llamar a 'urlConnection.connect()' antes de intentar acceder al encabezado 'Content-Length'. No hacerlo podría funcionar, pero no en todas las circunstancias posibles. – Felix

+0

No sabía que ... funcionó de esa manera para mí, pero gracias por su consejo. Voy a editar la respuesta. – Cristian

Respuesta

69

puede obtener un encabezado llamado Content-Length del objeto de Respuesta HTTP que obtiene, esto le dará la longitud del archivo. , debe tener en cuenta, sin embargo, que algunos servidores no devuelven esa información, y la única forma de saber el tamaño real es leer todo de la respuesta.

Ejemplo:

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

esto funcionará en la mayoría de los casos, pero si el archivo es demasiado grande, no funcionará. Ver mi publicación a continuación para una solución que siempre funciona: http://stackoverflow.com/a/12271781/878126 –

+0

Debe usar getContentLengthLong() en lugar de getContentLength() para Android 7 y superior. A continuación, prefiero usar Long.parseLong (urlConnection.getHeaderField ("content-length")) – Sandeep

16

normalmente se puede utilizar getContentLength, pero lo mejor es que obtener la longitud por sí mismo (ya que se puede pasar por alto el valor máximo de número entero).

simplemente analice el valor del encabezado de la longitud del contenido usted mismo. Mejor analizarlo siempre.

ejemplo:

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

tenga en cuenta que puedo ser cualquier cadena, a fin de utilizar intento de captura, y si es -1, vacía o nula, significa que no se puede saber el tamaño de la archivo ya que el servidor no lo permite.

+1

La primitiva de Java es un entero de 32 bits con signo; es probable que no supere el valor máximo con un encabezado de tipo de contenido – mjama

+4

que en realidad puede, es de aproximadamente 2 GB. –

+0

, entonces, ¿qué hacer al lado del servidor para que lo permita ...? –

Cuestiones relacionadas