Reanudar la descarga de archivos http en java

URL url = new URL("http://download.thinkbroadband.com/20MB.zip"); URLConnection connection = url.openConnection(); File fileThatExists = new File(path); OutputStream output = new FileOutputStream(path, true); connection.setRequestProperty("Range", "bytes=" + fileThatExists.length() + "-"); connection.connect(); int lenghtOfFile = connection.getContentLength(); InputStream input = new BufferedInputStream(url.openStream()); byte data[] = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; output.write(data, 0 , count); } 

En este código intento reanudar la descarga. El archivo de destino es 20MB. Pero cuando paro la transferencia directa en 10mb, entonces contunue, consigo el archivo con filesize 30MB. Parece que sigue escribiendo en el archivo, pero en parte no puede descargar desde el servidor. Wget -c funciona muy bien con este archivo. ¿Cómo puedo reanudar la descarga de archivos?

  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="+(file.length())+"-"); } }else{ connection.setRequestProperty("Range", "bytes=" + downloaded + "-"); } connection.setDoInput(true); connection.setDoOutput(true); progressBar.setMax(connection.getContentLength()); 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; progressBar.setProgress(downloaded); } 

Este no es mi código, pero funciona.

Supongo que el problema que se enfrentan es llamar a url.openStream() después de url.openConnection() .

url.openStream() es equivalente a url.openConnection().getInputStream() . Por lo tanto, usted está solicitando la URL dos veces. Particularmente la segunda vez, no está especificando la propiedad del rango. Por lo tanto, la descarga empieza siempre al principio.

Debe reemplazar url.openStream() con connection.getInputStream() .

Echa un vistazo a este hilo que tiene un problema similar al tuyo . Si wget está funcionando, entonces el servidor claramente apoya la reanudación de descargas. Parece que no está configurando el encabezado If-Range como se menciona en la respuesta aceptada del enlace anterior. es decir. añadir:

 // Initial download. String lastModified = connection.getHeaderField("Last-Modified"); // ... // Resume download. connection.setRequestProperty("If-Range", lastModified); 

Ya que la pregunta está etiquetada con Android: ¿Has intentado usar DownloadManager . Se encarga de todas estas cosas muy bien para usted.

¿Qué tal esto?

 public static void download(DownloadObject object) throws IOException{ String downloadUrl = object.getDownloadUrl(); String downloadPath = object.getDownloadPath(); long downloadedLength = 0; File file = new File(downloadPath); URL url = new URL(downloadUrl); BufferedInputStream inputStream = null; BufferedOutputStream outputStream = null; URLConnection connection = url.openConnection(); if(file.exists()){ downloadedLength = file.length(); connection.setRequestProperty("Range", "bytes=" + downloadedLength + "-"); outputStream = new BufferedOutputStream(new FileOutputStream(file, true)); }else{ outputStream = new BufferedOutputStream(new FileOutputStream(file)); } connection.connect(); inputStream = new BufferedInputStream(connection.getInputStream()); byte[] buffer = new byte[1024*8]; int byteCount; while ((byteCount = inputStream.read(buffer)) != -1){ outputStream.write(buffer, 0, byteCount); break; } inputStream.close(); outputStream.flush(); outputStream.close(); } 

Ruptura usada break; Para probar el código ..;)

Tengo una manera para que su código funcione.

  1. En primer lugar, compruebe si el archivo sale o no
  2. Si el archivo existe, configure la conexión:

     connection.setRequestProperty("Range", "bytes=" + bytedownloaded + "-"); 
  3. Si el archivo no existe, haga la misma descarga en un archivo nuevo.

  • ¿Es posible descargar apk desde google play programáticamente a PC?
  • Android.os.NetworkOnMainThreadException usando rxjava en android
  • Comportamiento extraño utilizando el operador ternario de Java en Android
  • Significado de RuntimeException ("Stub!") En Android
  • Biblioteca binaria preconfigurada nativa en Android Studio con el complemento experimental de Gradle
  • Cómo mostrar "\ ,, /" como cadena
  • Cambiar el color del texto en android.R.layout.simple_list_item_2
  • La forma más segura de usar SharedPreferences
  • Posible pérdida de memoria a través de FinalizerReference
  • ¿Hay alguna manera de pedir permiso mediante programación?
  • ¿Eclipse Paho Mqtt Client persiste en todos los mensajes publicados publicados hasta que son ACKed para ser entregados por el corredor bajo QoS-2?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.