日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

php實現斷點續傳大文件示例代碼

瀏覽:244日期:2022-09-09 18:07:02

一、斷點續傳原理

所謂斷點續傳,也就是要從文件已經下載的地方開始繼續下載。在以前版本的 HTTP 協議是不支持斷點的,HTTP/1.1 開始就支持了。一般斷點下載時才用到 Range 和 Content-Range 實體頭。

不使用斷點續傳

get /down.zip http/1.1accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*accept-language: zh-cnaccept-encoding: gzip, deflateuser-agent: mozilla/4.0 (compatible; msie 5.01; windows nt 5.0)connection: keep-alive

服務器收到請求后,按要求尋找請求的文件,提取文件的信息,然后返回給瀏覽器,返回信息如下:

HTTP/1.1 200 Okcontent-length=106786028accept-ranges=bytesdate=mon, 30 apr 2001 12:56:11 gmtetag=w/'02ca57e173c11:95b'content-type=application/octet-streamserver=microsoft-iis/5.0last-modified=mon, 30 apr 2001 12:56:11 gmt

使用斷點續傳

GET /down.zip HTTP/1.0User-Agent: NetFoxRANGE: bytes=2000070-Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

多了這么一行Range: bytes=2000070-

這一行的意思就是告訴服務器down.zip這個文件從2000070字節開始傳,前面的字節不用傳了。Range的完整格式是:

Range: bytes=startOffset-targetOffset/sum [表示從startOffset讀取,一直讀取到targetOffset位置,讀取總數為sum直接] Range: bytes=startOffset-targetOffset [字節總數也可以去掉]

服務器收到這個請求以后,返回的信息如下:

HTTP/1.1 206 Partial Contentcontent-length=106786028content-range=bytes 2000070-106786027/106786028date=mon, 30 apr 2001 12:55:20 gmtetag=w/'02ca57e173c11:95b'content-type=application/octet-streamserver=microsoft-iis/5.0last-modified=mon, 30 apr 2001 12:55:20 gmt

和前面服務器返回的信息比較一下,就會發現增加了一行:

Content-Range=bytes 2000070-106786027/106786028

返回的代碼也改為206了,而不再是200了。

HTTP/1.1 206 Partial Content

知道了以上原理,就可以進行斷點續傳的編程了。

二、PHP實現

/** php下載類,支持斷點續傳 * download: 下載文件 * setSpeed: 設置下載速度 * getRange: 獲取header中Range */ class FileDownload{ /** 下載 * @param String $file 要下載的文件路徑 * @param String $name 文件名稱,為空則與下載的文件名稱一樣 * @param boolean $reload 是否開啟斷點續傳 */ public function download($file, $name=’’, $reload=false){ $fp = @fopen($file, ’rb’); if($fp){ if($name==’’){ $name = basename($file); } $header_array = get_headers($file, true); //var_dump($header_array);die; // 下載本地文件,獲取文件大小 if (!$header_array) { $file_size = filesize($file); } else { $file_size = $header_array[’Content-Length’]; } $ranges = $this->getRange($file_size); $ua = $_SERVER['HTTP_USER_AGENT'];//判斷是什么類型瀏覽器 header(’cache-control:public’); header(’content-type:application/octet-stream’); $encoded_filename = urlencode($name); $encoded_filename = str_replace('+', '%20', $encoded_filename); //解決下載文件名亂碼 if (preg_match('/MSIE/', $ua) || preg_match('/Trident/', $ua) ){ header(’Content-Disposition: attachment; filename='’ .$encoded_filename . ’'’); } else if (preg_match('/Firefox/', $ua)) { header(’Content-Disposition: attachment; filename*='utf8’’’ . $name . ’'’); }else if (preg_match('/Chrome/', $ua)) { header(’Content-Disposition: attachment; filename='’ . $encoded_filename . ’'’); } else { header(’Content-Disposition: attachment; filename='’ . $name . ’'’); } //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)); //file_put_contents(’test.log’,sprintf(’content-length:%u’,$ranges[’end’]-$ranges[’start’]),FILE_APPEND); // fp指針跳到斷點位置 fseek($fp, sprintf(’%u’, $ranges[’start’])); }else{ file_put_contents(’test.log’,’2222’,FILE_APPEND); header(’HTTP/1.1 200 OK’); header(’content-length:’.$file_size); } while(!feof($fp)){ //echo fread($fp, round($this->_speed*1024,0)); //echo fread($fp, $file_size); echo fread($fp, 4096); ob_flush(); } ($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){ //file_put_contents(’range.log’, json_encode($_SERVER), FILE_APPEND); 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; }} $obj = new FileDownload();$obj->download(’http://down.golaravel.com/laravel/laravel-master.zip’,’’, true);

以上就是php實現斷點續傳大文件示例代碼的詳細內容,更多關于php 斷點續傳大文件的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品官网| 国产精品日韩久久久| 激情91久久| 老牛影视精品| 国产中文字幕一区二区三区| 国产精品尤物| 国产视频网站一区二区三区| 国产一级成人av| 欧美精品中文| 欧美日本精品| 日韩免费精品| 欧美日韩亚洲国产精品| 日韩高清一区二区| 国产精品激情| 最新中文字幕在线播放| 国产乱人伦精品一区| 国产亚洲人成a在线v网站| 日本午夜精品一区二区三区电影| 日韩综合一区二区三区| 欧美亚洲综合视频| 欧美激情三区| 亚洲深夜视频| 久久人人99| 久久亚洲欧美| 国产精品亚洲欧美一级在线| 国产精品一区二区美女视频免费看| 久久久久伊人| 日本久久成人网| 久久亚洲欧美| 国产九一精品| 日韩欧美不卡| 久久国产精品色av免费看| 成人黄色av| 99视频精品| 欧美一区二区三区久久精品| 国产一区调教| 免费视频亚洲| 精品中国亚洲| 婷婷亚洲五月色综合| 免费久久99精品国产| 日韩综合小视频| 成人午夜在线| 亚洲一区二区三区免费在线观看| 日韩中文字幕一区二区高清99| 精品国产精品国产偷麻豆| 日韩在线综合| 视频在线观看国产精品| 国产日韩视频| 一本大道色婷婷在线| 亚洲欧美久久| 亚洲综合欧美| 美女视频免费精品| 老鸭窝毛片一区二区三区| 欧美成a人片免费观看久久五月天| 免费国产亚洲视频| 国产欧美高清| 日韩av午夜在线观看| 97se综合| 亚洲乱码视频| 国产激情在线播放| 亚洲乱码久久| 日韩国产欧美一区二区| 免费人成在线不卡| 国产欧美一区二区三区精品酒店| 免费观看在线综合| 在线手机中文字幕| 911精品国产| 女人av一区| 91亚洲人成网污www| 日韩精品欧美成人高清一区二区| 国产一区二区三区精品在线观看 | 福利片在线一区二区| 免费成人性网站| 国产高潮在线| 欧美日韩一区自拍| 亚洲视频播放| 日本精品在线中文字幕| 国产精品日本一区二区三区在线 | 国产欧美一级| 国产亚洲精品v| 伊人久久av| 国产精品午夜一区二区三区| 久久最新视频| 久久精品导航| 福利精品一区| 国产私拍福利精品视频二区| 美女被久久久| 欧美va天堂在线| 在线天堂中文资源最新版| 国产精品久久久久av蜜臀| 免费在线观看成人| 欧美日韩精品一本二本三本| 成人污污视频| 国产精品久久久久久久久久白浆| 亚洲精选av| 9国产精品视频| 亚洲香蕉网站| 91精品xxx在线观看| 精品日产乱码久久久久久仙踪林| 日韩极品在线观看| 亚洲精品国模| 一区二区三区四区日韩| 免费不卡中文字幕在线| 欧洲av不卡| 日韩大片在线播放| 福利精品在线| 日本精品黄色| 久久精品免视看国产成人| 欧美另类中文字幕| 欧美一区不卡| 国产欧美日韩综合一区在线播放| 亚洲精品护士| 蜜臀av国产精品久久久久| 欧美网站在线| 黑丝一区二区| 99国产精品99久久久久久粉嫩| 欧美jjzz| 99re国产精品| 免费在线观看日韩欧美| 日韩影院在线观看| 在线看片日韩| 亚洲一二三区视频| 亚洲欧洲av| 日韩高清一级| 国产精品一区二区精品| 国产精品分类| 精品欠久久久中文字幕加勒比| 加勒比视频一区| 国产传媒在线| 亚洲午夜电影| 免费成人在线影院| 日本综合精品一区| 国产精品激情电影| 视频在线不卡免费观看| 日韩精品诱惑一区?区三区| 久久久久久免费视频| 亚洲www啪成人一区二区| 日韩欧美中文| 久久青草久久| 免费av一区| 蜜桃视频一区二区三区在线观看| 中文字幕av一区二区三区人| 日本免费新一区视频| 国产精品日韩精品中文字幕| 精品久久免费| 99久久精品网站| 老司机精品久久| 日韩国产一二三区| 欧美91在线| 久久久精品日韩| 亚洲经典在线| 亚洲3区在线| 国产精品v一区二区三区| 久久av日韩| 欧美久久天堂| 一区二区视频欧美| 日韩高清不卡一区| 视频在线不卡免费观看| 国产精品88久久久久久| 综合亚洲自拍| 你懂的亚洲视频| 欧美一级鲁丝片| 9国产精品视频| 国产精品一区免费在线| 天堂√中文最新版在线| 尤物在线精品| 国产精品色婷婷在线观看| 人人精品亚洲| 爽好久久久欧美精品| 国产高清精品二区| 欧美1区免费| 国产精品亚洲综合色区韩国| 久久精品高清| 日韩国产欧美三级| 日韩在线短视频| 午夜久久av| 日韩中文欧美| 青青青国产精品| 成人羞羞在线观看网站| 亚洲专区视频| 中文字幕在线看片| 亚洲视频二区| 中文在线а√在线8| 黄色亚洲在线| 精品国产18久久久久久二百| 国产视频亚洲| 国产一区二区三区四区五区传媒| 亚洲激情av| 精品无人区麻豆乱码久久久| 亚洲免费黄色| 国际精品欧美精品| 免费成人在线影院| 女生影院久久| 久久国内精品| 欧美日韩视频| www在线观看黄色| 日韩欧美中文在线观看| 日韩av首页| 日本免费新一区视频| 国产尤物精品|