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?
- Android sqlite insert no está insertando
- Problema: Pasar datos grandes a la segunda actividad
- Leer y escribir datos con GSON
- Cómo recuperar el valor de un atributo que contiene dos puntos en el nombre del atributo utilizando xpath
- Cómo utilizar FFT para filtrar un ruido de 50Hz de una matriz de datos?
- Android: guarda la imagen de la URL en la tarjeta SD
- ¿Hay alguna manera de ejecutar Runnable ejecutar () lanzar una excepción?
- Android - Campo int final dentro del método onCreate ()
- Android java.lang.IllegalArgumentException in HttpGet
- En la API de GoogleCloudMessaging, ¿cómo manejar la renovación o caducidad del ID de registro?
- Revise la fecha con la fecha de hoy
- ¿Aparejos rizados en "nueva" expresión? (Por ejemplo, "new MyClass () {...}")
- Cómo desplazamiento mediante programación de un ScrollView a inferior
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.
- En primer lugar, compruebe si el archivo sale o no
-
Si el archivo existe, configure la conexión:
connection.setRequestProperty("Range", "bytes=" + bytedownloaded + "-");
-
Si el archivo no existe, haga la misma descarga en un archivo nuevo.
- Uso de BottomSheetBehavior con un CoordinatorLayout interno
- Desactivar desplazamiento para posición en RecyclerView utilizando ItemTouchHelper.SimpleCallback