2011-01-04 15 views
9

Este código para reanudar la descarga no funciona correctamente en Android, aunque funciona bien en una aplicación Java. Aquí estoy tratando de descargar un archivo zip, y se reanudará la descarga, pero el resultado neto es un archivo zip no válido.Reanudar Descargar no funciona en android

BufferedInputStream in = null; 
     FileOutputStream fos = null; 
     BufferedOutputStream bout=null; 

     try { 
      downloaded=0; 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      if(ISSUE_DOWNLOAD_STATUS.intValue()==ECMConstant.ECM_DOWNLOADING){ 
       File file=new File(DESTINATION_PATH); 
       if(file.exists()){ 
        downloaded = (int) file.length(); 
       } 
      } 
      connection.setRequestProperty("Range", "bytes=" + downloaded + "-"); 
      connection.connect(); 
      size=connection.getContentLength(); 
      Dialog.setMax(size); 
      in = new BufferedInputStream(connection.getInputStream()); 
      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); 
       downloaded += x; 
       System.out.println(downloaded); 
       onProgressUpdate((int)(downloaded*100/size)); 
      } 

      succes=true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       in.close(); 
       bout.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 

Gracias.

+0

Agregue algunos detalles en su pregunta: ¿cuál es exactamente el problema al que se enfrenta? Hay algun error? Si es así, ¿puedes publicar thetacktrace? Necesitamos más detalles si queremos responderle. –

+0

En realidad, aquí estoy tratando de descargar un archivo zip ... y continuará descargando también ... pero el resultado neto es un archivo zip no válido ... –

Respuesta

10
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
int buf = 1024; 

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

connection.setDoInput(true); 
connection.setDoOutput(true); 

progressBar.setMax(connection.getContentLength()); 
in = new BufferedInputStream(connection.getInputStream()); 
fos = new FileOutputStream(DESTINATION_PATH, downloaded == 0 ? false : true); 
bout = new BufferedOutputStream(fos, buf); 
byte[] data = new byte[buf]; 

while ((int x = in.read(data, 0, buf)) >= 0) { 
    bout.write(data, 0, x); 
    downloaded += x; 
    progressBar.setProgress(downloaded); 
} 
+1

También agregaría un 'connection.setReadTimeout()' y un 'connection.setConnectionTimeout() ' –

+0

Hola Lijo, 'ISSUE_DOWNLOAD_STATUS.intValue()' no entiendo acerca de este valor por favor dame la referencia para esto. – DynamicMind

+2

Archivo file = new File (DESTINATION_PATH); if (file.exists()) { descargado = (int) file.length(); connection.setRequestProperty ("Rango", "bytes =" + (file.length()) + "-"); } \t \t \t} else { connection.setRequestProperty ("Rango", "bytes =" + descargado + "-"); \t \t \t} –

3

Su archivo comprimido está dañado porque cree que la secuencia se reanuda desde el byte de rango que ha especificado. En realidad, se reproduce nuevamente desde el principio, por lo que tiene un archivo más grande que el original. Para resumir, su servidor no es compatible con la propiedad del rango.