2010-08-06 40 views
19

这是当我不是注册用户时发布的my previous question的延续。作为一名进修人员,我试图恢复从我的雅虎下载一个大文件。网站服务器下载时被中断。我以前认为中断是由于100秒超时限制(因为雅虎强制执行用户书面脚本的时间限制)。但是,当我测量下载中断的时间时,我发现中断时间变化很大(有时下载不会中断少于100秒,有时甚至高达7分钟)。所以我不知道超时的原因,我只是想解决它们。如何恢复中断下载 - 第2部分

我尝试了naikus(谢谢)的建议,根据http头字段的转储,似乎我的Yahoo!网站服务器确实认识到“范围”属性,该属性应允许下载在中断的偏移量处恢复。不幸的是,虽然继续连接的http头中的字节范围显示正确,但传输的内容总是在文件的开头重新开始。 (我的测试文件是一个50,000个4字节整数的数组,从0开始递增。我的下载文件总是在发生下载中断的每个偏移量处开始重新计数。)

是否存在其他http连接属性要求我应该让Yahoo!服务器实际上跳到头的字节范围中指定的文件偏移量?下面的代码和它转储:

  // 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(); 

转储:

@ 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 

- - - 

从BalusC(感谢)技巧后,我修改了连接设置,但雅虎服务器在每次中断时都会重置为文件的开头。这里是改变的代码,并将所得转储:

  // 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()); 

转储:

@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

嗨,我有问题喜欢你的话题,请你帮我在这个话题上:https://stackoverflow.com/q/45324253/1830228? – 2017-07-27 04:27:37

回答

24

要恢复下载,您需要发送不仅Range请求头,而且还If-Range请求头其中应包含唯一文件标识符或文件修改时间戳。

如果服务器在初始下载时返回ETag响应标头,则应在随后的恢复请求的If-Range标头中使用它。或者,如果它返回一个Last-Modified响应标头,则应该在If-Range请求标头中使用它。

查看您的日志,服务器发送了一个Last-Modified响应标头。因此,您应该将其发送回恢复请求的If-Range标题。

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

// ... 

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

服务器将使用此信息来验证您是否请求完全相同的文件。

+0

感谢您的建议。一时兴起,我也尝试将下载的文件名从.zip(即content-type = [application/zip])的扩展名改为.dat(即content-type = [application/octet-stream]),我试着将请求属性键改为小写。不幸的是,雅虎!服务器在文件开始时继续恢复下载。 – gregS 2010-08-07 14:03:31

+0

无济于事,我也试过改变 connection.setRequestProperty(“Range”,“bytes =”+ downloaded +“ - ”); 到 connection.setRequestProperty( “范围”, “字节= - ” +(mDownloadFileLength - 下载)); – gregS 2010-08-07 19:35:38

+2

我收到了Yahoo!的回复。技术支持说雅虎!服务器不支持字节范围请求: “由于我们使用服务器池并且每个请求可能到达不同的服务器,雅虎虚拟主机不支持Accept-range标头,因此您会在响应中看到connection = [close]表明这一点的标题。“ – gregS 2010-08-11 11:27:04

5

看来,问题是调用

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

代替

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

url.openStream()使另一个调用openConnection()WITHOUT范围属性。

0

我设法实现我的客户端的Java应用程序HTTP恢复下载,诀窍是使用“如果-范围:original_ETag”作为一个公认的答案提到的请求头。这是一个完整的头文件调试信息,它可以帮助您了解简历的工作原理。

从服务器正常答复,文件从开始读到结束。 ETag值是来自磁盘文件的W /“filesize_bytes-modified_utc”元数据。它可能是别的,但那就是Tomcat使用的东西,通常最适合普通文件内容。

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 

客户端通过添加Range和If-Range标题从文件中读取给定的块。字节范围可以打开,因此服务器应该从给定索引开始读取到结尾。注意Content-Length不是文件的总长度,而是这个字节块。

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 

如果远程文件已更改,则服务器不应该返回206-PartialContent,而应该返回常规的200-OK答复。服务器应该使用If-Range值来检查一致性。像VLCPlayer这样的客户端会把Range域放在没有If范围值的地方。

当客户端被制造而无需范围的初始请求+如果型头可以添加“的If-Modified-时间:modified_http_date”报头。服务器可能会返回304-NotModified状态并完成客户端。如果客户端提供byteStartIdx> =文件大小,则服务器返回416-RequestedRangeNotSatisfiable。

附加调试转储以阐明http恢复如何工作。

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