2015-05-09 18 views
6

Sto provando a scaricare un file (mp3) dal mio server.Download file - lunghezza file negativa

Voglio mostrare lo stato del download, ma sto affrontando un problema per tutto il tempo che la dimensione del file è -1.

Lo screenshot: enter image description here
Il mio codice:

try { 
    URL url = new URL(urls[0]); 
    // URLConnection connection = url.openConnection(); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestMethod("GET"); 
    connection.setDoOutput(true); 
    connection.connect(); 
    int fileSize = connection.getContentLength(); 
    if (fileSize == -1) 
     fileSize = connection.getHeaderFieldInt("Length", -1); 
    InputStream is = new BufferedInputStream(url.openStream()); 
    OutputStream os = new FileOutputStream(myFile); 

    byte data[] = new byte[1024]; 
    long total = 0; 
    int count; 
    while ((count = is.read(data)) != -1) { 
     total += count; 
     Log.d("fileSize", "Lenght of file: " + fileSize); 
     Log.d("total", "Lenght of file: " + total); 
     // publishProgress((int) (total * 100/fileSize)); 
     publishProgress("" + (int) ((total * 100)/fileSize)); 
     os.write(data, 0, count); 
    } 
    os.flush(); 
    os.close(); 
    is.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

ottengo il valore dei rifiuti per la fileSize che restituiscono -1 (int fileSize = connection.getContentLength();)

+0

Utilizzare uno strumento da riga di comando come ** 'curl' ** per esaminare le intestazioni provenienti dal server quando si scarica questo URL manualmente. Forse il server non sta impostando alcun header relativo alla lunghezza. – CommonsWare

+2

A volte la lunghezza è sconosciuta - dipende dal lato server. Niente di male con la tua soluzione – Toumash

+0

@Prosanto Come vedo, anche se non viene visualizzato correttamente dovrebbe essere scaricato. Il file scaricato funziona? – Chaoz

risposta

2

Ispezionare le intestazioni server sta inviando. Molto probabilmente il server sta inviando Transfer-Encoding: Chunked e nessun'intestazione Content-Length affatto. Questa è una pratica comune in HTTP/1.1. Se il server non sta inviando la lunghezza, il cliente ovviamente non può saperlo. Se questo è il caso, e non hai il controllo sul codice del server, la cosa migliore da fare è probabilmente visualizzare solo un tipo di indicatore rotante.