溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例

發(fā)布時間:2021-03-05 11:16:00 來源:億速云 閱讀:294 作者:小新 欄目:編程語言

這篇文章主要介紹了基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、概述

所謂斷點(diǎn)續(xù)傳,其實(shí)只是指下載,也就是要從文件已經(jīng)下載的地方開始繼續(xù)下載。在以前版本的HTTP協(xié)議是不支持?jǐn)帱c(diǎn)的,HTTP/1.1開始就支持了。一般斷點(diǎn)下載時才用到Range和Content-Range實(shí)體頭。HTTP協(xié)議本身不支持?jǐn)帱c(diǎn)上傳,需要自己實(shí)現(xiàn)。

二、Range

用于請求頭中,指定第一個字節(jié)的位置和最后一個字節(jié)的位置,一般格式:

Range:用于客戶端到服務(wù)端的請求,可以通過改字段指定下載文件的某一段大小及其單位,字節(jié)偏移從0開始。典型格式:

Ranges: (unit=first byte pos)-[last byte pos]  Ranges: bytes=4000- 下載從第4000字節(jié)開始到文件結(jié)束部分  Ranges: bytes=0~N 下載第0-N字節(jié)范圍的內(nèi)容  Ranges: bytes=M-N 下載第M-N字節(jié)范圍的內(nèi)容  Ranges: bytes=-N 下載最后N字節(jié)內(nèi)容

1.以下幾點(diǎn)需要注意:

(1)這個數(shù)據(jù)區(qū)間是個閉合區(qū)間,起始值是0,所以“Range: bytes=0-1”這樣一個請求實(shí)際上是在請求開頭的2個字節(jié)。

(2)“Range: bytes=-200”,它不是表示請求文件開始位置的201個字節(jié),而是表示要請求文件結(jié)尾處的200個字節(jié)。

(3)如果last byte pos小于first byte pos,那么這個Range請求就是無效請求,server需要忽略這個Range請求,然后回應(yīng)一個200,把整個文件發(fā)給client。

(4)如果last byte pos大于等于文件長度,那么這個Range請求被認(rèn)為是不能滿足的,server需要回應(yīng)一個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

用于響應(yīng)頭,指定整個實(shí)體中的一部分的插入位置,他也指示了整個實(shí)體的長度。在服務(wù)器向客戶返回一個部分響應(yīng),它必須描述響應(yīng)覆蓋的范圍和整個實(shí)體長度。一般格式:

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- 或不用這個頭

一般正?;貞?yīng)

HTTP/1.1 200 OK Content-Length: 801   Content-Type: application/octet-stream Content-Range: bytes 0-800/801 //801:文件總大小

一個最簡單的斷點(diǎn)續(xù)傳實(shí)現(xiàn)大概如下:

1.客戶端下載一個1024K的文件,已經(jīng)下載了其中512K

2. 網(wǎng)絡(luò)中斷,客戶端請求續(xù)傳,因此需要在HTTP頭中申明本次需要續(xù)傳的片段:

Range:bytes=512000-

這個頭通知服務(wù)端從文件的512K位置開始傳輸文件

3. 服務(wù)端收到斷點(diǎn)續(xù)傳請求,從文件的512K位置開始傳輸,并且在HTTP頭中增加:

Content-Range:bytes 512000-/1024000

并且此時服務(wù)端返回的HTTP狀態(tài)碼應(yīng)該是206,而不是200。

但是在實(shí)際場景中,會出現(xiàn)一種情況,即在終端發(fā)起續(xù)傳請求時,URL對應(yīng)的文件內(nèi)容在服務(wù)端已經(jīng)發(fā)生變化,此時續(xù)傳的數(shù)據(jù)肯定是錯誤的。如何解決這個問題了?顯然此時我們需要有一個標(biāo)識文件唯一性的方法。在RFC2616中也有相應(yīng)的定義,比如實(shí)現(xiàn)Last-Modified來標(biāo)識文件的最后修改時間,這樣即可判斷出續(xù)傳文件時是否已經(jīng)發(fā)生過改動。同時RFC2616中還定義有一個ETag的頭,可以使用ETag頭來放置文件的唯一標(biāo)識,比如文件的MD5值。

終端在發(fā)起續(xù)傳請求時應(yīng)該在HTTP頭中申明If-Match 或者If-Modified-Since 字段,幫助服務(wù)端判別文件變化。

另外RFC2616中同時定義有一個If-Range頭,終端如果在續(xù)傳是使用If-Range。If-Range中的內(nèi)容可以為最初收到的ETag頭或者是Last-Modfied中的最后修改時候。服務(wù)端在收到續(xù)傳請求時,通過If-Range中的內(nèi)容進(jìn)行校驗,校驗一致時返回206的續(xù)傳回應(yīng),不一致時服務(wù)端則返回200回應(yīng),回應(yīng)的內(nèi)容為新的文件的全部數(shù)據(jù)。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI