php大檔案發送不了怎麼辦

藏色散人
發布: 2023-03-17 19:22:02
原創
1845 人瀏覽過

php大檔案發送不了的解決方法:1、設定Range參數,語法如「 Ranges:(unit=first byte pos)-[last byte pos]」;2、設定「Content-Range」; 3.透過「GET /test.rar HTTP/1.1 Connection: close Host: 116.1.219.219」請求下載整個檔案即可。

php大檔案發送不了怎麼辦

本教學操作環境:Windows10系統、PHP8.1版、DELL G3電腦

php大檔案傳送不了怎麼辦?

PHP上傳超大檔案解決方案

一、概述​​

 

所謂斷點續傳,其實只是指下載,也就是要從文件已經下載的地方開始繼續下載。在先前版本的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回應,回應的內容為新的文件的全部數據。

推薦學習:《PHP影片教學

以上是php大檔案發送不了怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!