gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

PHP如何實現斷點續傳大文件?

PHP如何實現斷點續傳大文件?

一、斷點續傳原理

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

不使用斷點續傳

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

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

HTTP/1.1 200 Ok
content-length=106786028
accept-ranges=bytes
date=mon, 30 apr 2001 12:56:11 gmt
etag=w/"02ca57e173c11:95b"
content-type=application/octet-stream
server=microsoft-iis/5.0
last-modified=mon, 30 apr 2001 12:56:11 gmt

使用斷點續傳

GET /down.zip HTTP/1.0
User-Agent: NetFox
RANGE: 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 Content
content-length=106786028
content-range=bytes 2000070-106786027/106786028
date=mon, 30 apr 2001 12:55:20 gmt
etag=w/"02ca57e173c11:95b"
content-type=application/octet-stream
server=microsoft-iis/5.0
last-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》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
超级碰在线观看| aa免费在线观看| 日韩一区二区三区不卡视频| 99热亚洲精品| 国产l精品国产亚洲区久久| 久草热视频在线观看| 亚洲精品蜜桃久久久久久| 成人高清dvd| 高清欧美精品xxxxx| 日韩精品在线观看av| 2018国产在线| 999香蕉视频| 艹b视频在线观看| 热这里只有精品| 精品国产av无码一区二区三区| 800av在线免费观看| 成人一对一视频| 91制片厂毛片| 免费的av在线| 国产精品无码一本二本三本色| 国产成人精品视频ⅴa片软件竹菊| 欧美一级黄色影院| 182午夜视频| 波多野结衣家庭教师在线| 国产精品乱码久久久久| 国产精品久久成人免费观看| 日本一级黄视频| 污污的网站18| 台湾无码一区二区| 在线免费观看av的网站| 97av中文字幕| 色综合手机在线| 欧美日韩激情四射| 国产三级三级看三级| 久久久性生活视频| 日本黄色播放器| 毛葺葺老太做受视频| 青青青在线观看视频| 久久久久久久久久一区| 激情综合在线观看| 久久观看最新视频| 制服丝袜中文字幕第一页| 久久免费视频3| 日韩 欧美 视频| 日本久久高清视频| 鲁一鲁一鲁一鲁一av| 成人在线观看黄| 青草青青在线视频| 麻豆视频传媒入口| 色黄视频免费看| 日韩精品视频一二三| 国产av麻豆mag剧集| 日本男女交配视频| 桥本有菜av在线| 国产精品久久久久久久av福利| 国产成人综合一区| 日韩少妇内射免费播放| 69sex久久精品国产麻豆| 国产精品88久久久久久妇女| 五月激情婷婷在线| 一本色道久久亚洲综合精品蜜桃 | 亚洲第一狼人区| 777米奇影视第四色| 无码人妻丰满熟妇区毛片18| 99在线免费视频观看| 日韩 欧美 视频| 青青草精品视频在线| 日本一道本久久| 亚洲精品无码久久久久久| 久久国产成人精品国产成人亚洲| 无码粉嫩虎白一线天在线观看| 欧美日韩午夜爽爽| koreanbj精品视频一区| 青青在线视频观看| 国产v亚洲v天堂无码久久久| 日韩免费高清在线| 97超碰成人在线| 中文字幕超清在线免费观看| 日本a在线天堂| 99蜜桃臀久久久欧美精品网站| 国产综合av在线| 爱爱爱爱免费视频| 久久久99精品视频| 久久久久久久激情| 黄色一级片免费的| 和岳每晚弄的高潮嗷嗷叫视频| av免费中文字幕| 国产又粗又猛大又黄又爽| 又大又硬又爽免费视频| 五月婷婷激情久久| 国产在线拍揄自揄拍无码| 国产亚洲天堂网| 香蕉视频在线网址| 无遮挡又爽又刺激的视频| 中文字幕一区二区在线观看视频| 国产美女作爱全过程免费视频| 免费男同深夜夜行网站| 少妇高潮大叫好爽喷水| 无码人妻丰满熟妇区毛片| 无码毛片aaa在线| 高清一区在线观看| 亚洲国产精品成人天堂| 亚洲天堂2018av| 国产亚洲欧美在线视频| 亚洲精品天堂成人片av在线播放| 又色又爽又高潮免费视频国产| 老司机激情视频| 成人亚洲免费视频| 国产精品视频黄色| 成人免费毛片网| 欧美午夜小视频| 男女啪啪的视频| 亚洲欧美天堂在线| 91极品视频在线观看| 99久久激情视频| 黄色网页免费在线观看| 国产精品va在线观看无码| 400部精品国偷自产在线观看| 精品日韩久久久| 亚洲成人福利在线观看| 久久综合久久色| 欧美黄色一级片视频| 亚洲国产成人精品无码区99| 国产精品久久久影院| 中文字幕第50页| 性生活免费观看视频| 免费精品99久久国产综合精品应用| 色婷婷综合久久久久中文字幕| 131美女爱做视频| 131美女爱做视频| 一本大道熟女人妻中文字幕在线| 日韩精品视频在线观看视频| 国内精品在线观看视频| 黄色成人在线看| 午夜精品久久久内射近拍高清 | 免费一级特黄录像| 天天爽天天爽夜夜爽| 中文字幕网av| www.激情小说.com| 视频区 图片区 小说区| 天天操精品视频| 狠狠干视频网站| 黄色www网站| 手机看片福利日韩| av不卡在线免费观看| 青青草视频在线视频| 精品人妻一区二区三区四区在线| 免费观看成人在线视频| 国产无遮挡猛进猛出免费软件 | 国产美女主播在线| 久久久免费视频网站| 久久久精品麻豆| 300部国产真实乱| aa在线免费观看| 三日本三级少妇三级99| 欧美一级视频免费看| 不卡的av中文字幕| 国产精品69久久久| 亚洲黄色小视频在线观看| 美女在线免费视频| 日本三级免费观看| 日本黄xxxxxxxxx100| 亚洲爆乳无码专区| 亚洲小视频在线播放| 88av.com| 国产无限制自拍| 51自拍视频在线观看| 国产日产欧美视频| 国产精品自拍合集| 免费成年人高清视频| 欧美 日韩 国产 高清| 红桃视频一区二区三区免费| 国产日产欧美视频| 日韩视频 中文字幕| 成年人三级黄色片| 男人天堂999| 成人免费播放器| 亚洲成人动漫在线| 亚洲成人天堂网| 白嫩少妇丰满一区二区| 丝袜人妻一区二区三区| avove在线观看| 国产在线视频三区| 在线观看亚洲色图| 熟女少妇精品一区二区| 激情综合网婷婷| 97成人在线免费视频| 国产一区二区三区小说| 最新av网址在线观看| 九九九久久久久久久| 亚洲图片 自拍偷拍| 爱爱爱爱免费视频| 国产精品v日韩精品v在线观看| 成人一区二区三| 能在线观看的av网站| 亚洲爆乳无码专区| 日韩亚洲在线视频| 黄色国产小视频| 亚洲这里只有精品| 四虎影院一区二区|