1. 程式人生 > 其它 >js+分佈上傳大檔案

js+分佈上傳大檔案

一、概述

所謂斷點續傳,其實只是指下載,也就是要從檔案已經下載的地方開始繼續下載。在以前版本的HTTP協議是不支援斷點的,HTTP/1.1開始就支援了。一般斷點下載時才用到Range和Content-Range實體頭。HTTP協議本身不支援斷點上傳,需要自己實現。

二、Range

用於請求頭中,指定第一個位元組的位置和最後一個位元組的位置,一般格式:

Range:用於客戶端到服務端的請求,可以通過改欄位指定下載檔案的某一段大小及其單位,位元組偏移從0開始。典型格式:

Ranges: (unit=first byte pos)-[last byte pos]

Ranges: bytes=4000- 下載從第4000位元組開始到檔案結束部分

Ranges: bytes=0~N 下載第0-N位元組範圍的內容

Ranges: bytes=M-N 下載第M-N位元組範圍的內容

Ranges: bytes=-N 下載最後N位元組內容


1.以下幾點需要注意:

(1)這個資料區間是個閉合區間,起始值是0,所以“Range: bytes=0-1”這樣一個請求實際上是在請求開頭的2個位元組。

(2)“Range: bytes=-200”,它不是表示請求檔案開始位置的201個位元組,而是表示要請求檔案結尾處的200個位元組。

(3)如果last byte pos小於first byte pos,那麼這個Range請求就是無效請求,server需要忽略這個Range請求,然後迴應一個200,把整個檔案發給client。

(4)如果last byte pos大於等於檔案長度,那麼這個Range請求被認為是不能滿足的,server需要回應一個416,Requested range not satisfiable。

2.示例解釋:

表示頭500個位元組:bytes=0-499

表示第二個500位元組:bytes=500-999

表示最後500個位元組:bytes=-500

表示500位元組以後的範圍:bytes=500-

第一個和最後一個位元組: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- 或不用這個頭

一般正常回應

HTTP/1.1 200 OK

Content-Length: 801

Content-Type: application/octet-stream

Content-Range: bytes 0-800/801 //801:檔案總大小

一個最簡單的斷點續傳實現大概如下:

1.客戶端下載一個1024K的檔案,已經下載了其中512K

2. 網路中斷,客戶端請求續傳,因此需要在HTTP頭中申明本次需要續傳的片段:

Range:bytes=512000-

這個頭通知服務端從檔案的512K位置開始傳輸檔案

3. 服務端收到斷點續傳請求,從檔案的512K位置開始傳輸,並且在HTTP頭中增加:

Content-Range:bytes 512000-/1024000

並且此時服務端返回的HTTP狀態碼應該是206,而不是200。

但是在實際場景中,會出現一種情況,即在終端發起續傳請求時,URL對應的檔案內容在服務端已經發生變化,此時續傳的資料肯定是錯誤的。如何解決這個問題了?顯然此時我們需要有一個標識檔案唯一性的方法。在RFC2616中也有相應的定義,比如實現Last-Modified來標識檔案的最後修改時間,這樣即可判斷出續傳檔案時是否已經發生過改動。同時RFC2616中還定義有一個ETag的頭,可以使用ETag頭來放置檔案的唯一標識,比如檔案的MD5值。

終端在發起續傳請求時應該在HTTP頭中申明If-Match 或者If-Modified-Since 欄位,幫助服務端判別檔案變化。

另外RFC2616中同時定義有一個If-Range頭,終端如果在續傳是使用If-Range。If-Range中的內容可以為最初收到的ETag頭或者是Last-Modfied中的最後修改時候。服務端在收到續傳請求時,通過If-Range中的內容進行校驗,校驗一致時返回206的續傳回應,不一致時服務端則返回200迴應,迴應的內容為新的檔案的全部資料。


相關參考連結:http+斷點續傳 – 澤優軟體部落格
歡迎入群一起討論:374992201