成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

php實現(xiàn)斷點續(xù)傳大文件示例代碼

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

一、斷點續(xù)傳原理

所謂斷點續(xù)傳,也就是要從文件已經(jīng)下載的地方開始繼續(xù)下載。在以前版本的 HTTP 協(xié)議是不支持?jǐn)帱c的,HTTP/1.1 開始就支持了。一般斷點下載時才用到 Range 和 Content-Range 實體頭。

不使用斷點續(xù)傳

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

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

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

使用斷點續(xù)傳

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

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

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

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

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

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

和前面服務(wù)器返回的信息比較一下,就會發(fā)現(xiàn)增加了一行:

Content-Range=bytes 2000070-106786027/106786028

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

HTTP/1.1 206 Partial Content

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

二、PHP實現(xiàn)

/** php下載類,支持?jǐn)帱c續(xù)傳 * download: 下載文件 * setSpeed: 設(shè)置下載速度 * getRange: 獲取header中Range */ class FileDownload{ /** 下載 * @param String $file 要下載的文件路徑 * @param String $name 文件名稱,為空則與下載的文件名稱一樣 * @param boolean $reload 是否開啟斷點續(xù)傳 */ 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){ // 使用續(xù)傳 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 ’’; } } /** 設(shè)置下載速度 * @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實現(xiàn)斷點續(xù)傳大文件示例代碼的詳細(xì)內(nèi)容,更多關(guān)于php 斷點續(xù)傳大文件的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产日韩欧美不卡在线| 国产日韩欧美高清免费| 精品久久一区二区| 久久先锋影音av| 亚洲永久精品国产| 日本欧洲一区二区| 国产成人免费在线| 国产精品vip| 国产精品一区二区欧美| 8v天堂国产在线一区二区| 国产欧美日产一区| 日韩一区二区三区视频在线观看| 亚洲永久免费| 亚洲欧美日韩小说| 日韩电影一二三区| 麻豆成人精品| 精品88久久久久88久久久| 国产精品麻豆99久久久久久| 亚洲va欧美va人人爽午夜| 欧美精品aa| 亚洲三级观看| 欧美在线视频日韩| 久久久噜噜噜久久人人看 | 中文字幕第一区| 蜜臀精品久久久久久蜜臀| av成人免费在线观看| 在线一区日本视频| 精品国产乱子伦一区| 国产成人免费av在线| 日韩欧美一区二区免费| 亚洲国产精品视频| jlzzjlzz欧美大全| 精品精品国产高清a毛片牛牛| 成人av网址在线| 在线观看视频一区二区欧美日韩| 午夜电影一区二区三区| 欧美影院一区| 欧美性xxxxxx少妇| 亚洲婷婷在线视频| 丰满少妇久久久久久久| 欧美三级第一页| 国产精品原创巨作av| 激情综合网av| 禁久久精品乱码| 91精品欧美综合在线观看最新| 日韩1区2区日韩1区2区| 亚洲永久免费精品| 午夜精品123| 在线日韩一区二区| 国产一区久久久| 日韩欧美一区二区免费| 免费观看30秒视频久久| 黄色成人精品网站| 亚洲少妇最新在线视频| 一区二区三区欧美在线| 视频在线观看91| 精品999成人| 亚洲最色的网站| 欧美xx69| 1024成人网| 99在线精品观看| 久久精品夜色噜噜亚洲a∨| 激情综合色丁香一区二区| 欧美婷婷在线| 亚洲精品欧美激情| 色综合咪咪久久| 555www色欧美视频| 99这里都是精品| 亚洲人成7777| 色婷婷综合五月| 一区二区三区四区精品在线视频| 亚欧成人精品| 亚洲人成网站精品片在线观看| 国产精品日韩二区| 美国一区二区三区在线播放| 欧美电视剧免费观看| 午夜精品剧场| 亚洲一区二区三区视频在线播放 | 欧美一区成人| 亚洲另类春色国产| 欧美亚洲免费在线一区| 99久久伊人久久99| 欧美性生活久久| 91小视频在线免费看| 日韩视频在线你懂得| 欧美午夜精彩| 免费观看在线综合色| 欧美一区二区在线免费播放 | www.色综合.com| 亚洲一区在线视频观看| 欧美浪妇xxxx高跟鞋交| 日韩av一二三| 精品国产乱码久久久久久免费| 1024成人| 亚洲色图制服诱惑 | 国产精品区二区三区日本| 精久久久久久久久久久| 欧美国产一区视频在线观看| 欧美亚洲一级| 久久狠狠亚洲综合| 亚洲视频免费| 蜜臀av在线播放一区二区三区| 久久人人爽爽爽人久久久| 国产伦精品一区二区三区视频黑人| 国产伦精品一区二区三区免费迷| 国产精品久久久久久妇女6080 | 国产精品国产精品国产专区不蜜 | 色婷婷精品大视频在线蜜桃视频| 99国产欧美另类久久久精品| 亚洲444eee在线观看| 欧美精品一区二区三区蜜桃视频| 免费久久99精品国产自在现线| av在线不卡免费看| 午夜私人影院久久久久| ww久久中文字幕| 日本高清不卡视频| 美洲天堂一区二卡三卡四卡视频| 日韩视频永久免费| 91色视频在线| 手机精品视频在线观看| 久久久不卡影院| 久久久国产精品一区二区三区| jlzzjlzz国产精品久久| 青青草视频一区| 综合激情成人伊人| 日韩一区二区三区四区五区六区 | 欧美日韩一区二区在线视频| 午夜天堂影视香蕉久久| 久久久亚洲国产美女国产盗摄| 日本黄色一区二区| 激情五月***国产精品| 国产99一区视频免费| 日韩在线一二三区| 国产精品伦理在线| 日韩亚洲欧美一区二区三区| 香蕉亚洲视频| 91成人在线观看喷潮| 国产综合自拍| 亚洲综合久久av| 国产亚洲一区字幕| 7878成人国产在线观看| 一本色道久久综合精品竹菊| 在线看片成人| 午夜视频久久久| 成人激情午夜影院| 久久成人免费电影| 五月婷婷综合在线| 亚洲欧美日韩在线播放| 久久久久久久性| 日韩亚洲欧美一区二区三区| 欧美午夜精品一区二区三区| 一区二区动漫| 欧美.日韩.国产.一区.二区| 国产99久久久国产精品潘金| 美女国产一区二区三区| 亚洲成a人片在线不卡一二三区| 中文一区在线播放| 久久综合国产精品| 欧美一区二区高清| 91久久国产综合久久| 亚洲在线观看| 中文久久精品| 亚洲黄色免费| 国户精品久久久久久久久久久不卡| eeuss鲁片一区二区三区在线看| 国产一区二区在线观看视频| 久久精品国产色蜜蜜麻豆| 肉色丝袜一区二区| 亚洲国产精品久久人人爱| 一区二区三区不卡在线观看| 亚洲视频 欧洲视频| 综合久久久久综合| 国产精品免费av| 国产欧美久久久精品影院 | 香蕉成人啪国产精品视频综合网| 亚洲免费在线播放| 综合欧美亚洲日本| 欧美激情一区二区三区蜜桃视频 | 亚洲东热激情| 亚洲国产高清视频| 亚洲高清视频一区| 亚洲国产精品第一区二区三区| 亚洲天堂偷拍| 一区二区激情| 香蕉精品999视频一区二区 | 美女www一区二区| 蜜乳av一区二区三区| 精品在线播放免费| 国产精品一区一区三区| 国产精品原创巨作av| 国产a区久久久| a美女胸又www黄视频久久| 91丨porny丨户外露出| 欧美激情1区| 亚洲视频久久| 亚洲一区二区三区色| 久久婷婷久久| 91香蕉视频mp4| 91同城在线观看| 国产在线精品一区二区中文|