5

Sto cercando di ottenere la dimensione dei contenuti di un URL utilizzando:Android: URLConnection.getContentLength() dando valore errato

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

Sto usando questo all'interno di un doInBackground()AsyncTask e per alcuni il motivo conn.getContentLength(); restituisce 1273 quando deve essere restituito 10136.

Ho utilizzato il codice precedente all'interno del Main di una normale applicazione Java e conn.getContentLength(); restituisce il valore corretto 10136.

Perché non funziona in un AsyncTask?

+0

Stai usando Chunked Transfer Encoding dal tuo server? – axierjhtjz

risposta

1

La descrizione di .getContentLength() è che restituisce il valore del campo dell'intestazione Content-Length. In circostanze normali, questo dovrebbe corrispondere alla quantità di dati disponibili da leggere. Tuttavia ...

(1) L'intestazione potrebbe non essere presente se la codifica Chunked viene utilizzata per inviare i dati. In questo caso, .getContentLength() restituisce -1 in modo che non sembra essere il caso qui.

(2) Per impostazione predefinita, l'implementazione di HttpURLConnection richiede che i server utilizzino la compressione gzip e decomprime automaticamente i dati per i chiamanti di getInputStream(). In questo caso, le intestazioni di risposta Content-Encoding e Content-Length vengono cancellate.

L'ultima frase sembra indicare che anche questo non è il caso qui, perché non si è trovato -1 da .getContentLength() `, ma le dimensioni relative (1273/10136) mi fanno sospetto ...

una prova di questo sarebbe per portatori di handicap codifica Gzip impostando le codifiche accettabili nell'intestazione della richiesta con:

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

Un'altra potrebbe essere quella di 'Snoop' il traffico di rete per all'osservatore le intestazioni HTTP e la quantità di dati di indizi .

BTW, url.openStream() è una comodità per url.openConnection().getInputStream().