studio por peticion enviar data java android android-asynctask urlconnection http-content-length

java - por - httpurlconnection post android



Android: URLConnection.getContentLength() dando un valor incorrecto (1)

Estoy tratando de obtener el tamaño de los contenidos de una URL usando:

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

Estoy usando esto dentro de doInBackground() de una AsyncTask y por alguna razón conn.getContentLength(); está devolviendo 1273 cuando debería devolver 10136 .

He utilizado el código anterior dentro de la Principal de una aplicación Java normal y conn.getContentLength(); devuelve el valor 10136 correcto.

¿Por qué no funciona en un AsyncTask ?


La descripción de .getContentLength() es que devuelve el valor del campo de encabezado Content-Length . En circunstancias normales, esto debe coincidir con la cantidad de datos disponibles para ser leídos. Sin embargo...

(1) El encabezado puede no estar presente si la codificación fragmentada se utiliza para enviar los datos. En este caso, .getContentLength() devuelve -1 por lo que parece no ser el caso aquí.

(2) De forma predeterminada, la implementación de HttpURLConnection solicita que los servidores usen la compresión gzip y descomprime automáticamente los datos para las personas que llaman de getInputStream() . Los encabezados de respuesta Content-Encoding y Content-Length se borran en este caso.

La última oración parece indicar que este tampoco es el caso aquí, porque no obtiene -1 de .getContentLength () `, pero los tamaños relativos (1273/10136) me hacen sospechar ...

Una prueba de esto sería deshabilitar la codificación Gzip estableciendo las codificaciones aceptables en el encabezado de solicitud con:

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

Otra sería "fisgonear" el tráfico de la red para observar los encabezados http y la cantidad de datos en busca de pistas.

Por cierto, url.openStream() es una conveniencia para url.openConnection().getInputStream() .