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

首頁 > 編程 > PHP > 正文

php實現的支持斷點續傳的文件下載類_0

2020-03-22 20:22:46
字體:
來源:轉載
供稿:網友
本文實例講述了php實現的支持斷點續傳的文件下載類及其用法,是非常實用的技巧。分享給大家供大家參考。具體方法如下:通常來說,php支持斷點續傳,主要依靠HTTP協議中 header HTTP_RANGE實現。HTTP斷點續傳原理:Http頭 Range、Content-Range()
HTTP頭中一般斷點下載時才用到Range和Content-Range實體頭,
Range用戶請求頭中,指定第一個字節的位置和最后一個字節的位置,如(Range:200-300)
Content-Range用于響應頭請求下載整個文件: 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:文件總大小FileDownload.html' target='_blank'>class.php類文件代碼如下: php /** php下載類,支持斷點續傳 * Date: 2013-06-30 * Author: test * Ver: 1.0 * Func: * download: 下載文件 * setSpeed: 設置下載速度 * getRange: 獲取header中Range class FileDownload{ // class start private $_speed = 512; // 下載速度 /** 下載 * @param String $file 要下載的文件路徑 * @param String $name 文件名稱,為空則與下載的文件名稱一樣 * @param boolean $reload 是否開啟斷點續傳 public function download($file, $name='', $reload=false){ if(file_exists($file)){ if($name==''){ $name = basename($file); $fp = fopen($file, 'rb'); $file_size = filesize($file); $ranges = $this- getRange($file_size); header('cache-control:public'); header('content-type:application/octet-stream'); header('content-disposition:attachment; filename='.$name); if($reload && $ranges!=null){ // 使用續傳 header('HTTP/1.1 206 Partial Content'); header('Accept-Ranges:bytes'); // 剩余長度 header(sprintf('content-length:%u',$ranges['end']-$ranges['start'])); // range信息 header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size)); // fp指針跳到斷點位置 fseek($fp, sprintf('%u', $ranges['start'])); }else{ header('HTTP/1.1 200 OK'); header('content-length:'.$file_size); while(!feof($fp)){ echo fread($fp, round($this- _speed*1024,0)); ob_flush(); //sleep(1); // 用于測試,減慢下載速度 ($fp!=null) && fclose($fp); }else{ return ''; /** 設置下載速度 * @param int $speed public function setSpeed($speed){ if(is_numeric($speed) && $speed 16 && $speed 4096){ $this- _speed = $speed; /** 獲取header range信息 * @param int $file_size 文件大小 * @return Array private function getRange($file_size){ if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])){ $range = $_SERVER['HTTP_RANGE']; $range = preg_replace('/[/s|,].*/', '', $range); $range = explode('-', substr($range, 6)); if(count($range) 2){ $range[1] = $file_size; $range = array_combine(array('start','end'), $range); if(empty($range['start'])){ $range['start'] = 0; if(empty($range['end'])){ $range['end'] = $file_size; return $range; return null; } // class end
$flag = $obj- download($file, $name); //$flag = $obj- download($file, $name, true); // 斷點續傳 if(!$flag){ echo 'file not exists';
斷點續傳測試方法:使用linux wget命令去測試下載, wget -c -O file http://xxx1.先關閉斷點續傳$flag = $obj- download($file, $name);
test@ubuntu:~/Downloads$ wget -O test.rar http://demo.test.com/demo.php --2013-06-30 16:52:44-- http://demo.test.com/demo.php 正在解析主機 demo.test.com... 127.0.0.1 正在連接 demo.test.com|127.0.0.1|:80... 已連接。 已發出 HTTP 請求,正在等待回應... 200 OK 長度: 10445120 (10.0M) [application/octet-stream] 正在保存至: “test.rar” 30% [============================ ] 3,146,580 513K/s 估時 14s test@ubuntu:~/Downloads$ wget -c -O test.rar http://demo.test.com/demo.php --2013-06-30 16:52:57-- http://demo.test.com/demo.php 正在解析主機 demo.test.com... 127.0.0.1 正在連接 demo.test.com|127.0.0.1|:80... 已連接。 已發出 HTTP 請求,正在等待回應... 200 OK 長度: 10445120 (10.0M) [application/octet-stream] 正在保存至: “test.rar” 30% [============================ ] 3,146,580 515K/s 估時 14s 可以看到,wget -c不能斷點續傳2.開啟斷點續傳$flag = $obj- download($file, $name, true);
test@ubuntu:~/Downloads$ wget -O test.rar http://demo.test.com/demo.php --2013-06-30 16:53:19-- http://demo.test.com/demo.php 正在解析主機 demo.test.com... 127.0.0.1 正在連接 demo.test.com|127.0.0.1|:80... 已連接。 已發出 HTTP 請求,正在等待回應... 200 OK 長度: 10445120 (10.0M) [application/octet-stream] 正在保存至: “test.rar” 20% [================== ] 2,097,720 516K/s 估時 16s test@ubuntu:~/Downloads$ wget -c -O test.rar http://demo.test.com/demo.php --2013-06-30 16:53:31-- http://demo.test.com/demo.php 正在解析主機 demo.test.com... 127.0.0.1 正在連接 demo.test.com|127.0.0.1|:80... 已連接。 已發出 HTTP 請求,正在等待回應... 206 Partial Content 長度: 10445121 (10.0M),7822971 (7.5M) 字節剩余 [application/octet-stream] 正在保存至: “test.rar” 100%[++++++++++++++++++++++++========================================================================= ] 10,445,121 543K/s 花時 14s 2013-06-30 16:53:45 (543 KB/s) - 已保存 “test.rar” [10445121/10445121]) 可以看到會從斷點的位置(%20)開始下載。本文實例完整源碼可點擊此處本站下載。相信本文所述對大家的PHP程序設計有一定的借鑒價值。PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 治多县| 平邑县| 蒲城县| 安溪县| 崇仁县| 响水县| 临夏市| 哈尔滨市| 开平市| 岗巴县| 康乐县| 巫溪县| 孝感市| 清丰县| 石门县| 和林格尔县| 怀仁县| 贡觉县| 宁南县| 建湖县| 宾阳县| 耿马| 西青区| 肃南| 抚远县| 邻水| 青铜峡市| 香格里拉县| 开远市| 都兰县| 富顺县| 双鸭山市| 九江市| 葫芦岛市| 尚义县| 平果县| 泾源县| 平和县| 平山县| 鲜城| 油尖旺区|