2010-08-05 35 views
21

Yahoo! 'Dan büyük bir dosya indirmeye çalışıyorum. Görünüşe göre (ki bana göre değil) kurulumları kesen web sitesi sunucusu, eğer 100 saniye içinde tamamlanmıyorsa, indirme işlemlerini keser. Dosya genellikle başarıyla aktarılacak kadar küçüktür. Veri hızının yavaş olduğu ve indirme bağlantısının kesildiği durumlarda, bağlantının kesildiği yerde dosya ofsetinde URLConnection'ı devam ettirmenin bir yolu var mıdır?Kesintisiz bir indirme nasıl başlatılır

// Setup connection. 
URL url = new URL(strUrl[0]); 
URLConnection cx = url.openConnection(); 
cx.connect(); 

// Setup streams and buffers. 
int lengthFile = cx.getContentLength(); 
InputStream input = new BufferedInputStream(url.openStream()); 
OutputStream output = new FileOutputStream(strUrl[1]); 
byte data[] = new byte[1024]; 

// Download file. 
for (total=0; (count=input.read(data, 0, 1024)) != -1; total+=count) { 
    publishProgress((int)(total*100/lengthFile)); 
    output.write(data, 0, count); 
    Log.d("AsyncDownloadFile", "bytes: " + total); 
} 

// Close streams. 
output.flush(); 
output.close(); 
input.close(); 
+1

Belki Yahoo web sunucusu dışında bir şey kullanın :) Android 'scp' yeteneklerine sahip değil mi? Buradaki büyük resim nedir? –

cevap

29

bir "Menzil" istek başlığını kullanmayı deneyin: Bunu yaptıktan sonra

// Open connection to URL. 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

// Specify what portion of file to download. 
connection.setRequestProperty("Range", "bytes=" + downloaded + "-"); 
// here "downloaded" is the data length already previously downloaded. 

// Connect to server. 
connection.connect(); 

, sadece veri indirme uzunluğuna önce belirli bir noktada (en seek, X söyleyebiliriz İşte kod) ve yeni indirilen verileri oraya yazmaya başlayın. Aralık başlığı için X aynı değeri kullandığınızdan emin olun. 14.35.2 Range Retrieval Requests

Daha ayrıntılı bilgi ve kaynak kodu hakkında

Detaylar

+3

Güzel örnek, muhtemelen bayt aralığı isteğini desteklediğinden emin olmak için, sunucudan yanıt kodunun 206 "Kısmi İçerik" olduğunu kontrol etmelisiniz. –

+1

naikus, yardımlarınız için teşekkürler. Hala w3 belgesini okuyorum ve Yahoo! 'nun nedenini bulmayı umuyordum. Sunucu her zaman belirtilen aralığın başlangıcından ziyade dosyanın başlangıcından iletilir. Daha fazla girişimi bu sorunun part 2 numaralı bölümünde açıklanmıştır. – gregS

+0

Yahoo! teknik destek Yahoo! sunucuları bayt aralığı isteklerini desteklemiyor: "Yahoo! Web Hosting, bir sunucu havuzu ile çalıştığımız ve her isteğin potansiyel olarak farklı bir sunucuya ulaştığından beri Accept-range üstbilgisini desteklemiyor. Bağlantı üstbilgisinde connection = [close] göreceksiniz bunu belirten " – gregS

0

Burada kullanabileceğiniz bir örnek kod here bulunabilir:

import java.io.*; 
import java.net.*; 


public class HttpUrlDownload { 

    public static void main(String[] args) { 
     String strUrl = "http://VRSDLSCEN001:80//DLS//lib//clics.jar"; 
     String DESTINATION_PATH = "clics.jar"; 

     int count = 0; 
     while (true) { 
      count++; 
      if (download(strUrl, DESTINATION_PATH) == true || count > 20) { 
      break; 
      }   
     } 
    } 

    public static boolean download(String strUrl, String DESTINATION_PATH) { 
     BufferedInputStream in = null; 
     FileOutputStream fos = null; 
     BufferedOutputStream bout = null; 
     URLConnection connection = null; 

     int downloaded = 0; 

     try { 
      System.out.println("mark ... download start"); 
      URL url = new URL(strUrl); 

      connection = url.openConnection(); 

      File file=new File(DESTINATION_PATH); 
      if(file.exists()){ 
       downloaded = (int) file.length(); 
      } 
      if (downloaded == 0) { 
       connection.connect(); 
      } 
      else { 
       connection.setRequestProperty("Range", "bytes=" + downloaded + "-"); 
       connection.connect(); 
      } 

      try { 
       in = new BufferedInputStream(connection.getInputStream()); 
      } catch (IOException e) { 
       int responseCode = 0; 
       try { 
        responseCode = ((HttpURLConnection)connection).getResponseCode(); 
       } catch (IOException e1) { 
       e1.printStackTrace(); 
       } 

       if (responseCode == 416) {   
        return true; 
       } else { 
        e.printStackTrace(); 
        return false; 
       } 
      } 

      fos=(downloaded==0)? new FileOutputStream(DESTINATION_PATH): new FileOutputStream(DESTINATION_PATH,true); 
      bout = new BufferedOutputStream(fos, 1024); 

      byte[] data = new byte[1024]; 
      int x = 0; 
      while ((x = in.read(data, 0, 1024)) >= 0) { 
       bout.write(data, 0, x); 
      } 

      in.close(); 
      bout.flush(); 
      bout.close(); 
      return false; 

     } catch (IOException e) { 
      e.printStackTrace(); 
      return false; 
     } finally { 
      if (in != null) { 
       try { 
        in.close(); 
       } catch (IOException e) { 
       } 
      } 
      if (fos != null) { 
       try { 
        fos.close(); 
       } catch (IOException e) { 
       } 
      } 
      if (bout != null) { 
       try { 
        bout.close(); 
       } catch (IOException e) { 
       } 
      } 

      if (connection != null) { 
       ((HttpURLConnection)connection).disconnect(); 
      } 
     } 
    } 
}  
İlgili konular