2010-08-06 26 views
19

Esta es una continuación de my previous question que publiqué cuando no era un usuario registrado. Como repaso, estoy tratando de reanudar la descarga de un archivo grande de mi Yahoo! servidor del sitio web cuando la descarga se interrumpe. Anteriormente pensé que la interrupción se debía a un límite de tiempo de espera de 100 segundos (porque Yahoo! aplica ese límite de tiempo a los scripts escritos por el usuario). Sin embargo, cuando medí el tiempo de las interrupciones de descarga, vi que el tiempo de interrupción varía mucho (a veces la descarga se ejecuta ininterrumpidamente durante menos de 100 segundos y, a veces, hasta siete minutos). Así que no sé el motivo de los tiempos muertos y solo trato de evitarlos.cómo reanudar una descarga interrumpida - parte 2

Probé la sugerencia por naikus (gracias) y, de acuerdo con el volcado de los campos del encabezado http, parece que mi Yahoo! El servidor del sitio web reconoce la propiedad "rango" que debería permitir que la descarga se reanude en el momento de la interrupción. Desafortunadamente, aunque el rango de bytes parece correcto en el encabezado http en las conexiones reanudadas, el contenido transferido siempre se reinicia al principio del archivo. (Mi archivo de prueba es una matriz de 50,000 enteros de 4 bytes que se incrementa comenzando en 0. Mi archivo descargado siempre comienza a contar a 0 en cada desplazamiento en el que ocurrió una interrupción de descarga)

¿Hay alguna otra propiedad de conexión HTTP? solicitud que debería hacer para obtener el Yahoo! servidor para saltar al desplazamiento de archivo especificado en el rango de bytes del encabezado? Aquí está el código y lo que vuelca:

  // Setup connection. 
     URL url = new URL(strUrl[0]); 
     URLConnection connection = url.openConnection(); 
     downloaded = Integer.parseInt(strUrl[3]); 
     if (downloaded > 0) { 
      connection.setRequestProperty("Range", "bytes="+downloaded+"-"); 
      connection.connect(); 
      fileLength = mDownloadFileLength; 
      Log.d("AsyncDownloadFile", 
       "new download seek: " + downloaded + 
       "; lengthFile: " + fileLength); 
     } 
     else { 
      connection.connect(); 
      downloaded = 0; 
      fileLength = connection.getContentLength(); 
      mDownloadFileLength = fileLength; 
     } 
     Map<String, List<String>> map = connection.getHeaderFields(); 
     Log.d("AsyncDownloadFile", "header fields: " + map.toString()); 

     // Setup streams and buffers. 
     input = new BufferedInputStream(url.openStream(), 8192); 
     outFile = new RandomAccessFile(strUrl[1], "rw"); 
     if (downloaded > 0) 
      outFile.seek(downloaded); 
     byte data[] = new byte[1024]; 

     // Download file. 
     for (int count=0, i=0; (count=input.read(data, 0, 1024)) != -1; i++) { 
      outFile.write(data, 0, count); 
      downloaded += count; 
      if (downloaded >= fileLength) 
       break; 

      // Display progress. 
      Log.d("AsyncDownloadFile", "bytes: " + downloaded); 
      if ((i%10) == 0) 
       publishProgress((int)(downloaded*100/fileLength)); 
      if (mFlagDisableAsyncTask) { 
       downloaded = 0; 
       break; 
      } 
     } 

     // Close streams. 
     outFile.close(); 
     input.close(); 

volcado:

@ 4:08:24 
D/AsyncDownloadFile(2372): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[2000000], age=[0], serve 
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:08:33 GMT]} 
D/AsyncDownloadFile(2372): bytes: 1024 
D/AsyncDownloadFile(2372): bytes: 1033 
D/AsyncDownloadFile(2372): bytes: 2057 
D/AsyncDownloadFile(2372): bytes: 2493 
D/AsyncDownloadFile(2372): bytes: 3517 
D/AsyncDownloadFile(2372): bytes: 3953 

. 
. 
. 

@ 4:13:25 
D/AsyncDownloadFile(2372): bytes: 386473 
D/AsyncDownloadFile(2372): bytes: 387497 
D/AsyncDownloadFile(2372): bytes: 387933 
D/AsyncDownloadFile(2372): new download seek: 387933; lengthFile: 2000000 
D/AsyncDownloadFile(2372): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[1612067], age=[0], serve 
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:13:29 GMT], co 
ntent-range=[bytes 387933-1999999/2000000]} 
D/AsyncDownloadFile(2372): bytes: 388957 
D/AsyncDownloadFile(2372): bytes: 389981 
D/AsyncDownloadFile(2372): bytes: 390409 
D/AsyncDownloadFile(2372): bytes: 391433 
D/AsyncDownloadFile(2372): bytes: 391869 
D/AsyncDownloadFile(2372): bytes: 392893 

. 
. 
. 

@ 4:18:45 
D/AsyncDownloadFile(2372): bytes: 775413 
D/AsyncDownloadFile(2372): bytes: 775849 
D/AsyncDownloadFile(2372): bytes: 776873 
D/AsyncDownloadFile(2372): bytes: 777309 
D/AsyncDownloadFile(2372): new download seek: 777309; lengthFile: 2000000 
D/AsyncDownloadFile(2372): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[1222691], age=[0], serve 
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:18:54 GMT], co 
ntent-range=[bytes 777309-1999999/2000000]} 
D/dalvikvm(2372): GC_FOR_MALLOC freed 11019 objects/470560 bytes in 155ms 
D/AsyncDownloadFile(2372): bytes: 778333 
D/AsyncDownloadFile(2372): bytes: 779357 
D/AsyncDownloadFile(2372): bytes: 779790 
D/AsyncDownloadFile(2372): bytes: 780814 
D/AsyncDownloadFile(2372): bytes: 781250 
D/AsyncDownloadFile(2372): bytes: 782274 

. 
. 
. 

@ 4:23:45 
D/AsyncDownloadFile(2372): bytes: 1163334 
D/AsyncDownloadFile(2372): bytes: 1163770 
D/AsyncDownloadFile(2372): bytes: 1164794 
D/AsyncDownloadFile(2372): bytes: 1165230 
D/AsyncDownloadFile(2372): new download seek: 1165230; lengthFile: 2000000 
D/AsyncDownloadFile(2372): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[834770], age=[0], server 
=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:23:47 GMT], con 
tent-range=[bytes 1165230-1999999/2000000]} 
D/AsyncDownloadFile(2372): bytes: 1166246 
D/AsyncDownloadFile(2372): bytes: 1167270 
D/AsyncDownloadFile(2372): bytes: 1167706 
D/AsyncDownloadFile(2372): bytes: 1168730 
D/AsyncDownloadFile(2372): bytes: 1169754 
D/AsyncDownloadFile(2372): bytes: 1170778 

. 
. 
. 

@ 4:30:25 
D/AsyncDownloadFile(2372): bytes: 1551255 
D/AsyncDownloadFile(2372): bytes: 1551691 
D/AsyncDownloadFile(2372): bytes: 1552715 
D/AsyncDownloadFile(2372): bytes: 1553151 
D/AsyncDownloadFile(2372): new download seek: 1553151; lengthFile: 2000000 
D/AsyncDownloadFile(2372): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[446849], age=[0], server 
=[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:30:44 GMT], con 
tent-range=[bytes 1553151-1999999/2000000]} 
D/AsyncDownloadFile(2372): bytes: 1554167 
D/AsyncDownloadFile(2372): bytes: 1554184 
D/AsyncDownloadFile(2372): bytes: 1555208 
D/AsyncDownloadFile(2372): bytes: 1555644 
D/AsyncDownloadFile(2372): bytes: 1556668 
D/AsyncDownloadFile(2372): bytes: 1557104 

. 
. 
. 

@ 4:37:10 
D/AsyncDownloadFile(2372): bytes: 1939188 
D/AsyncDownloadFile(2372): bytes: 1939624 
D/AsyncDownloadFile(2372): bytes: 1940648 
D/AsyncDownloadFile(2372): bytes: 1941084 
D/AsyncDownloadFile(2372): new download seek: 1941084; lengthFile: 2000000 
D/dalvikvm(2372): GC_FOR_MALLOC freed 13701 objects/604600 bytes in 128ms 
D/AsyncDownloadFile(2372): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[58916], age=[0], server= 
[YTS/1.17.13], accept-ranges=[bytes], date=[Fri, 06 Aug 2010 20:37:16 GMT], cont 
ent-range=[bytes 1941084-1999999/2000000]} 
D/AsyncDownloadFile(2372): bytes: 1942108 
D/AsyncDownloadFile(2372): bytes: 1942117 
D/AsyncDownloadFile(2372): bytes: 1943141 
D/AsyncDownloadFile(2372): bytes: 1943577 
D/AsyncDownloadFile(2372): bytes: 1944601 
D/AsyncDownloadFile(2372): bytes: 1945037 

. 
. 
. 

@ 4:38:30 
D/AsyncDownloadFile(2372): bytes: 1993217 
D/AsyncDownloadFile(2372): bytes: 1994241 
D/AsyncDownloadFile(2372): bytes: 1994677 
D/AsyncDownloadFile(2372): bytes: 1995701 
D/AsyncDownloadFile(2372): bytes: 1996137 
D/AsyncDownloadFile(2372): bytes: 1997161 
D/AsyncDownloadFile(2372): bytes: 1997597 
D/AsyncDownloadFile(2372): bytes: 1998621 
D/AsyncDownloadFile(2372): bytes: 1999057 
D/onPostExecute(2372): download: unsuccessful 

- - - 

Después de la punta de BalusC (gracias), he modificado la configuración de la conexión pero el Yahoo! el servidor continúa restableciendo al inicio del archivo en cada interrupción. Aquí está el código cambiado y los vertederos de resultantes:

  // Setup connection. 
      URL url = new URL(strUrl[0]); 
      URLConnection connection = url.openConnection(); 
      downloaded = Integer.parseInt(strUrl[3]); 
      if (downloaded == 0) { 
       connection.connect(); 
       strLastModified = connection.getHeaderField("Last-Modified"); 
       fileLength = connection.getContentLength(); 
       mDownloadFileLength = fileLength; 
      } 
      else { 
       connection.setRequestProperty("Range", "bytes=" + downloaded + "-"); 
       connection.setRequestProperty("If-Range", strLastModified); 
       connection.connect(); 
       fileLength = mDownloadFileLength; 
       Log.d("AsyncDownloadFile", 
         "new download seek: " + downloaded + 
         "; lengthFile: " + fileLength); 
      } 
      map = connection.getHeaderFields(); 
      Log.d("AsyncDownloadFile", "header fields: " + map.toString()); 

volcado:

@12:36:40 started 
D/AsyncDownloadFile( 413): header fields: {p3p=[policyref="http://info.yahoo.c 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTP 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA P 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-m 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[2000000], age=[0], serv 
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:36:56 GMT]} 
D/AsyncDownloadFile( 413): bytes: 1024 
D/AsyncDownloadFile( 413): bytes: 2048 
D/AsyncDownloadFile( 413): bytes: 2476 
D/AsyncDownloadFile( 413): bytes: 3500 
D/AsyncDownloadFile( 413): bytes: 3936 

... 

@12:39:20 interrupted 
D/AsyncDownloadFile( 413): bytes: 388068 
D/AsyncDownloadFile( 413): bytes: 389092 
D/AsyncDownloadFile( 413): bytes: 389376 
D/AsyncDownloadFile( 413): new download seek: 389376; lengthFile: 2000000 
D/AsyncDownloadFile( 413): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[1610624], age=[0], serve 
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:39:21 GMT], co 
ntent-range=[bytes 389376-1999999/2000000]} 
D/AsyncDownloadFile( 413): bytes: 390400 
D/AsyncDownloadFile( 413): bytes: 390409 
D/AsyncDownloadFile( 413): bytes: 391433 
D/AsyncDownloadFile( 413): bytes: 391869 

... 

@12:44:10 interrupted 
D/AsyncDownloadFile( 413): bytes: 775413 
D/AsyncDownloadFile( 413): bytes: 775849 
D/AsyncDownloadFile( 413): bytes: 776873 
D/AsyncDownloadFile( 413): bytes: 777309 
D/AsyncDownloadFile( 413): new download seek: 777309; lengthFile: 2000000 
D/AsyncDownloadFile( 413): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[1222691], age=[0], serve 
r=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:44:20 GMT], co 
ntent-range=[bytes 777309-1999999/2000000]} 
D/dalvikvm( 413): GC_FOR_MALLOC freed 10869 objects/465664 bytes in 122ms 
D/AsyncDownloadFile( 413): bytes: 778333 
D/AsyncDownloadFile( 413): bytes: 778342 
D/AsyncDownloadFile( 413): bytes: 779366 
D/AsyncDownloadFile( 413): bytes: 779802 

... 

@12:49:30 interrupted 
D/AsyncDownloadFile( 413): bytes: 1163782 
D/AsyncDownloadFile( 413): bytes: 1164806 
D/AsyncDownloadFile( 413): bytes: 1165242 
D/AsyncDownloadFile( 413): new download seek: 1165242; lengthFile: 2000000 
D/AsyncDownloadFile( 413): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[834758], age=[0], server 
=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:49:43 GMT], con 
tent-range=[bytes 1165242-1999999/2000000]} 
D/AsyncDownloadFile( 413): bytes: 1166266 
D/AsyncDownloadFile( 413): bytes: 1167290 
D/AsyncDownloadFile( 413): bytes: 1167718 
D/AsyncDownloadFile( 413): bytes: 1168742 

... 

@12:55:30 interrupted 
D/AsyncDownloadFile( 413): bytes: 1552722 
D/AsyncDownloadFile( 413): bytes: 1553158 
D/AsyncDownloadFile( 413): bytes: 1554182 
D/AsyncDownloadFile( 413): bytes: 1554618 
D/AsyncDownloadFile( 413): new download seek: 1554618; lengthFile: 2000000 
D/AsyncDownloadFile( 413): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[445382], age=[0], server 
=[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:55:39 GMT], con 
tent-range=[bytes 1554618-1999999/2000000]} 
D/AsyncDownloadFile( 413): bytes: 1555642 
D/AsyncDownloadFile( 413): bytes: 1556666 
D/AsyncDownloadFile( 413): bytes: 1557094 
D/AsyncDownloadFile( 413): bytes: 1558118 

... 

@12:57:20 interrupted 
D/AsyncDownloadFile( 413): bytes: 1941834 
D/AsyncDownloadFile( 413): bytes: 1942858 
D/AsyncDownloadFile( 413): bytes: 1943882 
D/AsyncDownloadFile( 413): bytes: 1943994 
D/AsyncDownloadFile( 413): new download seek: 1943994; lengthFile: 2000000 
D/AsyncDownloadFile( 413): header fields: {p3p=[policyref="http://info.yahoo.co 
m/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA PO 
L HEA PRE LOC GOV"], content-type=[application/zip], connection=[close], last-mo 
dified=[Fri, 06 Aug 2010 14:47:50 GMT], content-length=[56006], age=[0], server= 
[YTS/1.17.13], accept-ranges=[bytes], date=[Sat, 07 Aug 2010 04:57:15 GMT], cont 
ent-range=[bytes 1943994-1999999/2000000]} 
D/dalvikvm( 413): GC_FOR_MALLOC freed 13617 objects/602200 bytes in 165ms 
D/AsyncDownloadFile( 413): bytes: 1945018 
D/AsyncDownloadFile( 413): bytes: 1946042 
D/AsyncDownloadFile( 413): bytes: 1946470 
D/AsyncDownloadFile( 413): bytes: 1947494 

... 

@12:58:10 finished 
D/AsyncDownloadFile( 413): bytes: 1996103 
D/AsyncDownloadFile( 413): bytes: 1997127 
D/AsyncDownloadFile( 413): bytes: 1997563 
D/AsyncDownloadFile( 413): bytes: 1998587 
D/AsyncDownloadFile( 413): bytes: 1999023 
D/onPostExecute( 413): downloaded: unsuccessful 
+0

hola hombre, tengo un problema como con su tema, ¿podría ayudarme en este tema: https://stackoverflow.com/q/45324253/1830228? –

Respuesta

24

Para reanudar una descarga, es necesario enviar no sólo la cabecera Range solicitud, sino también la cabecera If-Range solicitud que debe contener el identificador único de archivo o la marca de tiempo de modificación de archivo.

Si el servidor devuelve un encabezado de respuesta ETag en la descarga inicial, entonces debe usarlo en el encabezado If-Range de las siguientes solicitudes de reanudación. O si devuelve un encabezado de respuesta Last-Modified, entonces debe usarlo en el encabezado de solicitud If-Range en su lugar.

En cuanto a sus registros, el servidor ha enviado un encabezado de respuesta Last-Modified. Por lo tanto, debe enviarlo de vuelta en un encabezado If-Range de la solicitud de reanudación.

// Initial download. 
String lastModified = connection.getHeaderField("Last-Modified"); 

// ... 

// Resume download. 
connection.setRequestProperty("If-Range", lastModified); 

El servidor utilizará esta información para verificar si está solicitando exactamente el mismo archivo.

+0

Gracias por la sugerencia. Por un capricho, también traté de cambiar la extensión del nombre de archivo descargado de .zip (es decir, content-type = [application/zip]) a .dat (es decir, content-type = [application/octet-stream]), y Traté de cambiar las claves de propiedad de solicitud a minúsculas. Desafortunadamente, Yahoo! el servidor continúa reanudando las descargas al comienzo del archivo. – gregS

+0

En vano, también intenté cambiar connection.setRequestProperty ("Rango", "bytes =" + descargado + "-"); a connection.setRequestProperty ("Rango", "bytes = -" + (mDownloadFileLength - descargado)); – gregS

+2

Recibí una respuesta de Yahoo! soporte técnico diciendo que el Yahoo! los servidores no son compatibles con las solicitudes de rango de bytes: "Yahoo Web Hosting no es compatible con el encabezado Aceptar rango ya que trabajamos con un grupo de servidores y cada solicitud potencialmente llega a un servidor diferente. Verá connection = [close] en la respuesta encabezado que indica esto ". – gregS

5

problema parece ser que está llamando

input = new BufferedInputStream(url.openStream(), 8192); 

en lugar de

input = new BufferedInputStream(connection.getInputStream(), 8192); 

url.openStream() hace otra llamada a openConnection()SIN la propiedad gama.

0

Me las arreglé para implementar la descarga de CV http en mi aplicación cliente de Java, el truco fue usar el encabezado de solicitud "If-Range: original_ETag" como se menciona en una respuesta aceptada. Aquí hay una información de depuración de encabezado completa que puede ayudarlo a comprender cómo funciona el currículum.

Respuesta normal del servidor, el archivo se lee desde el principio hasta el final. El valor ETag es metadatos W/"filesize_bytes-modified_utc" del archivo de disco. Podría ser otra cosa, pero eso es lo que usa Tomcat y, por lo general, es lo mejor para el contenido regular de archivos.

HTTP/1.1 200 OK 
ETag: W/"19097900-1410863319978" 
Last-Modified: Tue, 16 Sep 2014 10:28:39 GMT 
Content-Length: 19097900 
Content-Type: application/octet-stream 
Accept-Ranges: bytes 
Server: Apache-Coyote/1.1 
Date: Wed, 17 Sep 2014 10:39:52 GMT 

cliente lee un trozo determinado a partir del archivo mediante la adición de la gama y las cabeceras if-range. El rango de bytes puede estar abierto, por lo que el servidor debe leer desde el índice dado hasta el final. Nota Content-Length no es la longitud total del archivo sino este fragmento de bytes.

Range: bytes=10000000- 
If-Range: W/"19097900-1410863319978" 

HTTP/1.1 206 Partial Content 
ETag: W/"19097900-1410863319978" 
Last-Modified: Tue, 16 Sep 2014 10:28:39 GMT 
Content-Length: 9097900 
Content-Type: application/octet-stream 
Accept-Ranges: bytes 
Content-Range: bytes 10000000-19097899/19097900 
Server: Apache-Coyote/1.1 
Date: Wed, 17 Sep 2014 18:12:36 GMT 

Si se modificó el archivo remoto, el servidor no debe devolver 206-PartialContent pero la respuesta normal es 200-OK. El servidor debe usar el valor If-Range para verificar la coherencia. Algunos clientes como VLCPlayer ponen el campo Range sin el valor If-Range.

Cuando el cliente realiza una solicitud inicial sin los encabezados Rango + Si-Rango, puede agregar el encabezado "If-Modified-Since: modified_http_date". El servidor puede devolver el estado 304-NotModified y el cliente está listo. Si el cliente da byteStartIdx> = tamaño de archivo, entonces el servidor devuelve 416-RequestedRangeNotSatisfiable.

Volcados de depuración adicionales para aclarar cómo funciona http-resume.

Range=bytes=0-0 
If-Range=W/"19097900-1410863319978" 

HTTP/1.1 206 Partial Content 
ETag=W/"19097900-1410863319978" 
Date=Fri, 19 Sep 2014 12:53:36 GMT 
Content-Length=1 
Last-Modified=Tue, 16 Sep 2014 10:28:39 GMT 
Content-Type=application/octet-stream 
Accept-Ranges=bytes 
Server=Apache-Coyote/1.1 
Content-Range=bytes 0-0/19097900 
- - - - - 

Range=bytes=19097800-29097800 
If-Range=W/"19097900-1410863319978" 

HTTP/1.1 206 Partial Content 
ETag=W/"19097900-1410863319978" 
Date=Fri, 19 Sep 2014 12:59:24 GMT 
Content-Length=100 
Last-Modified=Tue, 16 Sep 2014 10:28:39 GMT 
Content-Type=application/octet-stream 
Accept-Ranges=bytes 
Server=Apache-Coyote/1.1 
Content-Range=bytes 19097800-19097899/19097900 
- - - - - - - - 

Range=bytes=19097899-19097899 
If-Range=W/"19097900-1410863319978" 

HTTP/1.1 206 Partial Content 
ETag=W/"19097900-1410863319978" 
Date=Fri, 19 Sep 2014 13:01:47 GMT 
Content-Length=1 
Last-Modified=Tue, 16 Sep 2014 10:28:39 GMT 
Content-Type=application/octet-stream 
Accept-Ranges=bytes 
Server=Apache-Coyote/1.1 
Content-Range=bytes 19097899-19097899/19097900 
Cuestiones relacionadas