一、概述
二、range
用於請求頭中,指定第乙個位元組的位置和最後乙個位元組的位置,一般格式:
ranges: (unit=first byte pos)-[last byte pos]
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示例
一般正常回應
content-range: bytes 0-800/801 //801:檔案總大小
乙個最簡單的斷點續傳實現大概如下:
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回應,回應的內容為新的檔案的全部資料。
js資料夾上傳
檔案上傳是 web 開發肯定會碰到的問題,而資料夾上傳則更加難纏。網上關於資料夾上傳的資料多集中在前端,缺少對於後端的關注,然後講某個後端框架檔案上傳的文章又不會涉及資料夾。今天研究了一下這個問題,在此記錄。先說兩個問題 是否所有後端框架都支援資料夾上傳?是否所有瀏覽器都支援資料夾上傳?第乙個問題 ...
java資料夾上傳
最近公司做工程專案,實現資料夾上傳。網上找了一天,發現網上很多 都存在相似問題,最後終於找到了乙個符合要求的專案。工程如下 這裡對專案的資料夾傳輸功能做出分析,怎麼實現資料夾上傳的,如何進行資料夾上傳的。執行 資料夾所在位置 c users liu desktop httpdebuggerpro v...
php選擇資料夾上傳
php用超級全域性變數陣列 files來記錄檔案上傳相關資訊的。1.file uploads on off 是否允許通過http方式上傳檔案 2.max execution time 30 允許指令碼最大執行時間,超過這個時間就會報錯 3.memory limit 50m 設定指令碼可以分配的最大記...