2015年8月8日 星期六

[技術的原理, ]實現Http斷點續傳

斷點續傳的原理,其實HTTP協定內已經有了,視Browser支援與否。



首先我們要下載一個 http://192.168.1.203/test.7z

透過Chrome 開發人員工具來看一下,一般我們直接下載一個檔案

head內容是什麼。

Request Head

GET /test.7z HTTP/1.1 Host: 192.168.1.203 Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4,zh-CN;q=0.2

Response Head

HTTP/1.1 200 OK Date: Tue, 07 Apr 2015 00:34:58 GMT Server: Apache/2.2.15 (Oracle) Last-Modified: Tue, 07 Apr 2015 00:33:02 GMT ETag: "1804d0-98e8754-513178ea80d56" Accept-Ranges: bytes Content-Length: 160335700 Connection: close Content-Type: text/plain; charset=UTF-8


首先我們發現到伺服器收到Requset之後,回應回來的狀態碼是 200,跟據WIKI上的解釋

200 OK  : 請求已成功,請求所希望的響應頭或資料體將隨此響應返回。

也就我們要下載的teset.7z 會整包下載回來,但這樣就無法達成續傳的要求。



查閱網路上資料,其實整包下載與"部份" 下載只差在Request Head 中需要多一行

Range: bytes 20-40

20-40指的是從第20個byte到40個byte (共21個)。

你可以用curl指令來測試伺服器是否支援 Range byte

範例如下,請將網址換成實際上用的URL



curl --silent --range 20-40 http://curl.haxx.se/docs/manpage.html | wc -c

以上述例子,如果輸出為21,表示伺服器支援,若回傳值為檔案完整大小,表示不支援。

若要開啟伺服器支援rangle byte,修改Apache 設定檔



  <Directory "/opt/local_htdocs">
       Options FollowSymLinks Indexes
       AllowOverride None
       Order allow,deny
       Allow from all
       Header set Accept-Ranges bytes
    </Directory>


參考來源:

http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/reference/HTTPservice.html












沒有留言:

張貼留言