2015-05-09 17 views
6

Ich versuche, eine Datei (mp3) von meinem Server herunterzuladen.Datei herunterladen - negative Dateilänge

Ich möchte den Download-Fortschritt zeigen, aber ich habe ein Problem, dass die gesamte Dateigröße -1 ist.

Der Screenshot: enter image description here
Mein Code:

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

ich den Müll Wert für die fileSize erhalten, die -1 (int fileSize = connection.getContentLength();) zurückkehren

+0

Verwenden Sie ein Befehlszeilentool wie ** 'curl' **, um die Header zu prüfen, die vom Server zurückkommen, wenn Sie diese URL manuell herunterladen. Vielleicht legt der Server keine längenbezogenen Header fest. – CommonsWare

+2

Manchmal ist die Länge unbekannt - es hängt von der Serverseite ab. Nichts ist falsch mit Ihrer Lösung – Toumash

+0

@Prosanto Wie ich sehe, auch wenn es nicht richtig angezeigt wird sollte es herunterladen. Funktioniert die heruntergeladene Datei? – Chaoz

Antwort

2

Überprüfen Sie die Header der Server zu senden ist. Sehr wahrscheinlich sendet der Server Transfer-Encoding: Chunked und keinen Content-Length Header überhaupt. Dies ist eine gängige Praxis in HTTP/1.1. Wenn der Server die Länge nicht sendet, kann der Client es offensichtlich nicht kennen. Wenn dies der Fall ist und Sie keine Kontrolle über den Servercode haben, ist es wahrscheinlich am besten, nur einen Indikator vom Spinner-Typ anzuzeigen.