所謂斷點續(xù)傳,其實只是指下載,也就是要從文件已經(jīng)下載的地方開始繼續(xù)下載。在以前版本的HTTP協(xié)議是不支持斷點的,HTTP/1.1開始就支持了。一般斷點下載時才用到Range和Content-Range實體頭。HTTP協(xié)議本身不支持斷點上傳,需要自己實現(xiàn)。
Range
用于請求頭中,指定第一個字節(jié)的位置和最后一個字節(jié)的位置,一般格式:
Range:用于客戶端到服務端的請求,可以通過改字段指定下載文件的某一段大小及其單位,字節(jié)偏移從0開始。典型格式:
Ranges:(unit=first byte pos)-[last byte pos]
Ranges:bytes=4000-下載從第4000字節(jié)開始到文件結束部分
Ranges:bytes=0~N下載第0-N字節(jié)范圍的內容
Ranges:bytes=M-N下載第M-N字節(jié)范圍的內容
Ranges:bytes=-N下載最后N字節(jié)內容
1.以下幾點需要注意:
(1)這個數(shù)據(jù)區(qū)間是個閉合區(qū)間,起始值是0,所以“Range:bytes=0-1”這樣一個請求實際上是在請求開頭的2個字節(jié)。
(2)“Range:bytes=-200”,它不是表示請求文件開始位置的201個字節(jié),而是表示要請求文件結尾處的200個字節(jié)。
(3)如果last byte pos小于first byte pos,那么這個Range請求就是無效請求,server需要忽略這個Range請求,然后回應一個200,把整個文件發(fā)給client。
(4)如果last byte pos大于等于文件長度,那么這個Range請求被認為是不能滿足的,server需要回應一個416,Requested range not satisfiable。
2.示例解釋:
表示頭500個字節(jié):bytes=0-499
表示第二個500字節(jié):bytes=500-999
表示最后500個字節(jié):bytes=-500
表示500字節(jié)以后的范圍:bytes=500-
第一個和最后一個字節(jié):bytes=0-0,-1
同時指定幾個范圍:bytes=500-600,601-999
Content-Range
用于響應頭,指定整個實體中的一部分的插入位置,他也指示了整個實體的長度。在服務器向客戶返回一個部分響應,它必須描述響應覆蓋的范圍和整個實體長度。一般格式:
Content-Range:bytes(unit first byte pos)-[last byte pos]/[entity legth]
Header示例
請求下載整個文件:
GET/test.rar HTTP/1.1
Connection:close
Host:116.1.219.219
Range:bytes=0-801//一般請求下載整個文件是bytes=0-或不用這個頭
一般正?;貞?/strong>
HTTP/1.1 200 OK
Content-Length:801
Content-Type:application/octet-stream
Content-Range:bytes 0-800/801//801:文件總大小
一個最簡單的斷點續(xù)傳實現(xiàn)大概如下:
1.客戶端下載一個1024K的文件,已經(jīng)下載了其中512K
2.網(wǎng)絡中斷,客戶端請求續(xù)傳,因此需要在HTTP頭中申明本次需要續(xù)傳的片段:
Range:bytes=512000-
這個頭通知服務端從文件的512K位置開始傳輸文件
3.服務端收到斷點續(xù)傳請求,從文件的512K位置開始傳輸,并且在HTTP頭中增加:
Content-Range:bytes 512000-/1024000
并且此時服務端返回的HTTP狀態(tài)碼應該是206,而不是200。
但是在實際場景中,會出現(xiàn)一種情況,即在終端發(fā)起續(xù)傳請求時,URL對應的文件內容在服務端已經(jīng)發(fā)生變化,此時續(xù)傳的數(shù)據(jù)肯定是錯誤的。如何解決這個問題了?顯然此時我們需要有一個標識文件唯一性的方法。在RFC2616中也有相應的定義,比如實現(xiàn)Last-Modified來標識文件的最后修改時間,這樣即可判斷出續(xù)傳文件時是否已經(jīng)發(fā)生過改動。同時RFC2616中還定義有一個ETag的頭,可以使用ETag頭來放置文件的唯一標識,比如文件的MD5值。
終端在發(fā)起續(xù)傳請求時應該在HTTP頭中申明If-Match或者If-Modified-Since字段,幫助服務端判別文件變化。
另外RFC2616中同時定義有一個If-Range頭,終端如果在續(xù)傳是使用If-Range。If-Range中的內容可以為最初收到的ETag頭或者是Last-Modfied中的最后修改時候。服務端在收到續(xù)傳請求時,通過If-Range中的內容進行校驗,校驗一致時返回206的續(xù)傳回應,不一致時服務端則返回200回應,回應的內容為新的文件的全部數(shù)據(jù)。
以上就是長沙一度軟件培訓java培訓機構的小編針對“Java實現(xiàn)斷點上傳視頻文件”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務。