disponibilidad comandos clusvcadm cluster alta java android download downloading

java - comandos - clusvcadm



Implementar pausa/reanudar en la descarga de archivos (5)

Estoy intentando implementar una pausa / reanudar en mi administrador de descargas, busco en la web y leo varios artículos y cambio mi código de acuerdo con ellos, pero el currículum parece no funcionar correctamente.

if (!downloadPath.exists()) downloadPath.mkdirs(); if (outputFileCache.exists()) { downloadedSize = outputFileCache.length(); connection.setAllowUserInteraction(true); connection.setRequestProperty("Range", "bytes=" + downloadedSize + "-"); connection.setConnectTimeout(14000); connection.connect(); input = new BufferedInputStream(connection.getInputStream()); output = new FileOutputStream(outputFileCache, true); input.skip(downloadedSize); //Skip downloaded size } else { connection.setConnectTimeout(14000); connection.connect(); input = new BufferedInputStream(url.openStream()); output = new FileOutputStream(outputFileCache); } fileLength = connection.getContentLength(); byte data[] = new byte[1024]; int count = 0; int __progress = 0; long total = downloadedSize; while ((count = input.read(data)) != -1 && !this.isInterrupted()) { total += count; output.write(data, 0, count); __progress = (int) (total * 100 / fileLength); } output.flush(); output.close(); input.close();


Creo que solo necesitas eliminar la línea input.skip (downloadSize). La configuración del encabezado HTTP para el rango de bytes significa que el servidor omitirá el envío de esos bytes.

Supongamos que tiene un archivo de 20 bytes que consta de "aaaaabbbbbcccccddddd" y suponga que la transferencia se detiene después de descargar 5 bytes. Luego, el encabezado de rango hará que el servidor envíe "bbbbccccccddddd", debe leer todo este contenido y adjuntarlo al archivo, sin omitir (). Pero la llamada skip () en su código omitirá "bbbbb" y dejará "cccccddddd" para descargar. Si ya ha descargado al menos el 50% del archivo, entonces skip () agotará todas las entradas y no ocurrirá nada.

Además, todas las cosas en la publicación de stringy05 se aplican. Debe asegurarse de que el servidor admita HTTP / 1.1, de que el encabezado de rango sea compatible con el recurso (es posible que el contenido generado dinámicamente no lo admita) y de asegurarse de que el recurso no se modifique con la fecha de modificación y modificación.


El problema está solucionado, aquí está mi código para otros usuarios que desean implementar pausa / reanudar:

if (outputFileCache.exists()) { connection.setAllowUserInteraction(true); connection.setRequestProperty("Range", "bytes=" + outputFileCache.length() + "-"); } connection.setConnectTimeout(14000); connection.setReadTimeout(20000); connection.connect(); if (connection.getResponseCode() / 100 != 2) throw new Exception("Invalid response code!"); else { String connectionField = connection.getHeaderField("content-range"); if (connectionField != null) { String[] connectionRanges = connectionField.substring("bytes=".length()).split("-"); downloadedSize = Long.valueOf(connectionRanges[0]); } if (connectionField == null && outputFileCache.exists()) outputFileCache.delete(); fileLength = connection.getContentLength() + downloadedSize; input = new BufferedInputStream(connection.getInputStream()); output = new RandomAccessFile(outputFileCache, "rw"); output.seek(downloadedSize); byte data[] = new byte[1024]; int count = 0; int __progress = 0; while ((count = input.read(data, 0, 1024)) != -1 && __progress != 100) { downloadedSize += count; output.write(data, 0, count); __progress = (int) ((downloadedSize * 100) / fileLength); } output.close(); input.close(); }


Empezaría a depurar desde esta línea:

connection.setRequestProperty("Range", "bytes=" + downloadedSize + "-");

A partir del código fuente, no es posible determinar qué es el tamaño downloadedSize , es difícil de elaborar más, pero el formato debe ser bytes=from-to .

De todos modos, te sugiero que uses Apache HttpClient para evitar errores comunes. Here hay una pregunta de alguien que usa Apache HttpClient sobre un tema similar y se proporciona un código de ejemplo.


Es imposible saber qué es lo que está mal sin más información, sin embargo, hay que tener en cuenta lo siguiente:

  1. Debe realizar una solicitud HTTP / 1.1 (es difícil decirlo a partir de su código de muestra)
  2. El servidor debe soportar HTTP / 1.1
  3. El servidor le dirá lo que admite con un encabezado Aceptar rangos en la respuesta
  4. Si el rango debe ser el valor que el servidor le dio para el recurso, no la última vez que se modificó

Debe verificar su solicitud de rango con algo simple para probar que el origen realmente admite la solicitud de rango primero (como curl o wget)


Puede ser que su servidor se esté demorando en responder (más que el límite de tiempo de espera) o esto es también un hecho que no todos los servidores admiten pausa - reanudar. También es un punto para reflexionar sobre el clima en que se descarga el archivo a través de Http, https, ftp o udp.

Pausar "podría significar simplemente leer parte de la transmisión y escribirla en el disco. Al reanudar, tendrá que usar los encabezados para especificar qué queda para descargar .

puede intentar algo como

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

y por favor intenta sincronizar las cosas.