2010-08-06 28 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