2015-05-09 21 views
6

Sunucumdan bir dosya (mp3) indirmeye çalışıyorum.Dosya karşıdan yükleme - negatif dosya uzunluğu

İndirme işleminin ilerlemesini göstermek istiyorum ancak dosya boyutu -1 olduğu zaman bir sorunla karşılaşıyorum.

ekran görüntüsü: enter image description here
Kodum:

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

ben -1 (int fileSize = connection.getContentLength();) return fileSize için çöp değeri elde

+0

Bu URL'yi el ile yüklediğinizde, sunucudan geri gelen başlıkları incelemek için ** 'curl' ** gibi bir komut satırı aracı kullanın. Belki de sunucu herhangi bir uzunluk ile ilgili başlık ayarlamıyor. – CommonsWare

+2

Bazen Uzunluk bilinmiyor - sunucu tarafına bağlı. Çözümünüzle ilgili yanlış bir şey yok – Toumash

+0

@Prosanto Gördüğüm gibi, doğru şekilde gösterilmese bile indirilmemelidir. İndirilen dosya çalışıyor mu? – Chaoz

cevap

2

sunucu gönderiyor başlıkları inceleyin. Muhtemelen sunucu, Transfer-Encoding: Chunked ve Content-Length başlığını göndermiyor. Bu, HTTP/1.1'de yaygın bir uygulamadır. Sunucu uzunluğunu göndermiyorsa, istemci açıkçası bunu bilemez. Durum buysa ve sunucu kodu üzerinde herhangi bir kontrole sahip değilseniz, yapılacak en iyi şey muhtemelen yalnızca bir döndürücü tip göstergesi gösterir.