如何基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳(HTTP)
這篇文章主要介紹了如何基于SpringMVC實(shí)現(xiàn)斷點(diǎn)續(xù)傳(HTTP),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
一、概述
所謂斷點(diǎn)續(xù)傳,其實(shí)只是指下載,也就是要從文件已經(jīng)下載的地方開(kāi)始繼續(xù)下載。在以前版本的HTTP協(xié)議是不支持?jǐn)帱c(diǎn)的,HTTP/1.1開(kāi)始就支持了。一般斷點(diǎn)下載時(shí)才用到Range和Content-Range實(shí)體頭。HTTP協(xié)議本身不支持?jǐn)帱c(diǎn)上傳,需要自己實(shí)現(xiàn)。
二、Range
用于請(qǐng)求頭中,指定第一個(gè)字節(jié)的位置和最后一個(gè)字節(jié)的位置,一般格式:
Range:用于客戶端到服務(wù)端的請(qǐng)求,可以通過(guò)改字段指定下載文件的某一段大小及其單位,字節(jié)偏移從0開(kāi)始。典型格式:
- Ranges: (unit=first byte pos)-[last byte pos]
- Ranges: bytes=4000- 下載從第4000字節(jié)開(kāi)始到文件結(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)這個(gè)數(shù)據(jù)區(qū)間是個(gè)閉合區(qū)間,起始值是0,所以“Range: bytes=0-1”這樣一個(gè)請(qǐng)求實(shí)際上是在請(qǐng)求開(kāi)頭的2個(gè)字節(jié)。
(2)“Range: bytes=-200”,它不是表示請(qǐng)求文件開(kāi)始位置的201個(gè)字節(jié),而是表示要請(qǐng)求文件結(jié)尾處的200個(gè)字節(jié)。
(3)如果last byte pos小于first byte pos,那么這個(gè)Range請(qǐng)求就是無(wú)效請(qǐng)求,server需要忽略這個(gè)Range請(qǐng)求,然后回應(yīng)一個(gè)200,把整個(gè)文件發(fā)給client。
(4)如果last byte pos大于等于文件長(zhǎng)度,那么這個(gè)Range請(qǐng)求被認(rèn)為是不能滿足的,server需要回應(yīng)一個(gè)416,Requested range not satisfiable。
2.示例解釋:
表示頭500個(gè)字節(jié):bytes=0-499
表示第二個(gè)500字節(jié):bytes=500-999
表示最后500個(gè)字節(jié):bytes=-500
表示500字節(jié)以后的范圍:bytes=500-
第一個(gè)和最后一個(gè)字節(jié):bytes=0-0,-1
同時(shí)指定幾個(gè)范圍:bytes=500-600,601-999
三、Content-Range
用于響應(yīng)頭,指定整個(gè)實(shí)體中的一部分的插入位置,他也指示了整個(gè)實(shí)體的長(zhǎng)度。在服務(wù)器向客戶返回一個(gè)部分響應(yīng),它必須描述響應(yīng)覆蓋的范圍和整個(gè)實(shí)體長(zhǎng)度。一般格式:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
四、Header示例
請(qǐng)求下載整個(gè)文件:
GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219 Range: bytes=0-801 //一般請(qǐng)求下載整個(gè)文件是bytes=0- 或不用這個(gè)頭
一般正?;貞?yīng)
HTTP/1.1 200 OK Content-Length: 801 Content-Type: application/octet-stream Content-Range: bytes 0-800/801 //801:文件總大小
一個(gè)最簡(jiǎn)單的斷點(diǎn)續(xù)傳實(shí)現(xiàn)大概如下:
1.客戶端下載一個(gè)1024K的文件,已經(jīng)下載了其中512K
2. 網(wǎng)絡(luò)中斷,客戶端請(qǐng)求續(xù)傳,因此需要在HTTP頭中申明本次需要續(xù)傳的片段:
Range:bytes=512000-
這個(gè)頭通知服務(wù)端從文件的512K位置開(kāi)始傳輸文件
3. 服務(wù)端收到斷點(diǎn)續(xù)傳請(qǐng)求,從文件的512K位置開(kāi)始傳輸,并且在HTTP頭中增加:
Content-Range:bytes 512000-/1024000
并且此時(shí)服務(wù)端返回的HTTP狀態(tài)碼應(yīng)該是206,而不是200。
但是在實(shí)際場(chǎng)景中,會(huì)出現(xiàn)一種情況,即在終端發(fā)起續(xù)傳請(qǐng)求時(shí),URL對(duì)應(yīng)的文件內(nèi)容在服務(wù)端已經(jīng)發(fā)生變化,此時(shí)續(xù)傳的數(shù)據(jù)肯定是錯(cuò)誤的。如何解決這個(gè)問(wèn)題了?顯然此時(shí)我們需要有一個(gè)標(biāo)識(shí)文件唯一性的方法。在RFC2616中也有相應(yīng)的定義,比如實(shí)現(xiàn)Last-Modified來(lái)標(biāo)識(shí)文件的最后修改時(shí)間,這樣即可判斷出續(xù)傳文件時(shí)是否已經(jīng)發(fā)生過(guò)改動(dòng)。同時(shí)RFC2616中還定義有一個(gè)ETag的頭,可以使用ETag頭來(lái)放置文件的唯一標(biāo)識(shí),比如文件的MD5值。
終端在發(fā)起續(xù)傳請(qǐng)求時(shí)應(yīng)該在HTTP頭中申明If-Match 或者If-Modified-Since 字段,幫助服務(wù)端判別文件變化。
另外RFC2616中同時(shí)定義有一個(gè)If-Range頭,終端如果在續(xù)傳是使用If-Range。If-Range中的內(nèi)容可以為最初收到的ETag頭或者是Last-Modfied中的最后修改時(shí)候。服務(wù)端在收到續(xù)傳請(qǐng)求時(shí),通過(guò)If-Range中的內(nèi)容進(jìn)行校驗(yàn),校驗(yàn)一致時(shí)返回206的續(xù)傳回應(yīng),不一致時(shí)服務(wù)端則返回200回應(yīng),回應(yīng)的內(nèi)容為新的文件的全部數(shù)據(jù)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入淺出重構(gòu)Mybatis與Spring集成的SqlSessionFactoryBean(上)
通常來(lái)講,重構(gòu)是指不改變功能的情況下優(yōu)化代碼,但本文所說(shuō)的重構(gòu)也包括了添加功能。這篇文章主要介紹了重構(gòu)Mybatis與Spring集成的SqlSessionFactoryBean(上)的相關(guān)資料,需要的朋友可以參考下2016-11-11解析Tomcat 6、7在EL表達(dá)式解析時(shí)存在的一個(gè)Bug
這篇文章主要是對(duì)Tomcat 6、7在EL表達(dá)式解析時(shí)存在的一個(gè)Bug進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12基于SpringBoot+Avue實(shí)現(xiàn)短信通知功能
Avue是基于vue和element-ui的快速開(kāi)發(fā)框架 ,它的核心是數(shù)據(jù)驅(qū)動(dòng)UI的思想,讓我們從繁瑣的crud開(kāi)發(fā)中解脫出來(lái),本文將給大家介紹一下使用SpringBoot+Avue實(shí)現(xiàn)短信通知功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-09-09java階乘計(jì)算獲得結(jié)果末尾0的個(gè)數(shù)代碼實(shí)現(xiàn)
今天偶然看到一個(gè)要求,求1000~10000之間的數(shù)n的階乘并計(jì)算所得的數(shù)n!末尾有多少個(gè)0?要求: 不計(jì)算 只要得到末尾有多少個(gè)0就可以了,看下面的代碼吧2013-12-12Mybatis?Plus使用XML編寫(xiě)動(dòng)態(tài)sql的超簡(jiǎn)易方法
這篇文章主要介紹了Mybatis?Plus使用XML編寫(xiě)動(dòng)態(tài)sql的超簡(jiǎn)易方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01