国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

PHP支持斷點續(xù)傳實例代碼

2024-09-04 11:44:53
字體:
供稿:網(wǎng)友

讓PHP下載代碼支持斷點續(xù)傳,主要靠的 HTTP協(xié)議中header Content-Range來實現(xiàn).

先來說說 HTTP的下載原理

對于HTTP協(xié)議,向服務(wù)器請求某個文件時,只要發(fā)送類似如下的請求即可,代碼如下:

GET /Path/FileName HTTP/1.0 

Host: www.server.com:80

Accept: **表示接收任何類型的數(shù)據(jù)。User-Agent表示用戶代理,這個字段可有可無,但強烈建議加上,因為它是服務(wù)器統(tǒng)計、追蹤以及識別客戶端的依據(jù)。Connection字段中的close表示使用非持久連接。

關(guān)于HTTP協(xié)議更多的細節(jié)可以參考RFC2616(HTTP 1.1),因為我只是想通過HTTP協(xié)議實現(xiàn)文件下載,所以也只看了一部分,并沒有看全。

如果服務(wù)器成功收到該請求,并且沒有出現(xiàn)任何錯誤,則會返回類似下面的數(shù)據(jù):

  1. HTTP/1.0 200 OK  
  2. Content-Length: 13057672  
  3. Content-Type: application/octet-stream  
  4. Last-Modified: Wed, 10 Oct 2005 00:56:34 GMT  
  5. Accept-Ranges: bytes  
  6. ETag: "2f38a6cac7cec51:160c"  
  7. Server: Microsoft-IIS/6.0  
  8. X-Powered-By: ASP.NET  
  9. Date: Wed, 16 Nov 2005 01:57:54 GMT  
  10. Connection: close   

先定義一個函數(shù) getRange() 這個函數(shù)用來處理 header中 Range 具體數(shù)據(jù)的處理,代碼如下:

  1. /** $file_size  文件大小 */ 
  2.  function getRange($file_size){  
  3.     $range = isset($_SERVER['HTTP_RANGE'])?$_SERVER['HTTP_RANGE']:null;  
  4.     if(!emptyempty($range)){  
  5.         $range = preg_replace('/[s|,].*/'''$range);  
  6.         $range = explode('-',substr($range,6));  
  7.         if (count($range) < 2 ) {  
  8.             $range[1] = $file_size;  
  9.         }  
  10.         $range = array_combine(array('start','end'),$range);  
  11.         if (emptyempty($range['start'])) {  
  12.             $range['start'] = 0;  
  13.         }  
  14.         if (!isset ($range['end']) || emptyempty($range['end'])) {  
  15.             $range['end'] = $file_size;  
  16.         }  
  17.         return $range;  
  18.     }  
  19.     return null;  

假設(shè)文件的地址為 $file_path,代碼如下:

  1. $speed = 512;//此參數(shù)為下載最大速度  
  2. $pos = strrpos($file_path"/");  
  3. $file_name = substr($file_path$pos+1);  
  4. $file_size = filesize($file_path);  
  5. $ranges = getRange($file_size);  
  6. $fh =  fopen($file_path"rb");  
  7. header('Cache-control: public');  
  8. header('Content-Type: application/octet-stream');  
  9. header('Content-Disposition: attachment; filename='.$file_name);  
  10. if ($ranges != null) {  
  11.     header('HTTP/1.1 206 Partial Content');  
  12.     header('Accept-Ranges: bytes');  
  13.     header(sprintf('Content-Length: %u',$ranges['end'] - $ranges['start']));  
  14.     header(sprintf('Content-Range: bytes %s-%s/%s'$ranges['start'], $ranges['end'], $file_size));  
  15.     fseek($fh, sprintf('%u',$ranges['start']));  
  16. }else{  
  17.     header("HTTP/1.1 200 OK");  
  18.     header(sprintf('Content-Length: %s'$file_size));  
  19. }  
  20. while(!feof($fh))  
  21. {  
  22.     echo  fread($fhround($speed*1024, 0));  
  23.     ob_flush();  
  24.     sleep(1);  
  25. }  
  26. ($fh != null) && fclose($fh); 

基本如此,就可以解決一般性文件的斷點續(xù)傳或者下載.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广宁县| 株洲县| 资溪县| 内江市| 颍上县| 巴中市| 大石桥市| 出国| 全椒县| 北海市| 宾阳县| 长宁县| 宿州市| 离岛区| 奇台县| 定结县| 新丰县| 大丰市| 马山县| 渝北区| 滦南县| 宁阳县| 高尔夫| 卢龙县| 含山县| 通河县| 岳阳市| 萨迦县| 富民县| 古田县| 营山县| 卓尼县| 乡城县| 龙山县| 藁城市| 张掖市| 鄯善县| 明水县| 福州市| 霍山县| 朝阳县|