php实现断点续传大文件示例代码

php实现断点续传大文件示例代码

一、断点续传原理

所谓断点续传,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和-Range实体头。

不使用断点续传

get/down.ziphttp/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;msie5.01;windowsnt5.0)
connection:keep-alive

服务器收到请求后断点续传 java,按要求寻找请求的文件,提取文件的信息php实现断点续传大文件示例代码,然后返回给浏览器断点续传 javaphp实现断点续传大文件示例代码,返回信息如下:

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

使用断点续传

GET/down.zipHTTP/1.0
User-Agent:NetFox
RANGE:bytes=2000070-
Accept:text/html,image/gif,image/jpeg,*;q=.2,*/*;q=.2

多了这么一行Range:bytes=-

这一行的意思就是告诉服务器down.zip这个文件从字节开始传断点续传 java,前面的字节不用传了。

Range的完整格式是:

Range:bytes=startOffset-targetOffset/sum[表示从startOffset读取,一直读取到targetOffset位置,读取总数为sum直接]
Range:bytes=startOffset-targetOffset[字节总数也可以去掉]

服务器收到这个请求以后,返回的信息如下:

HTTP/1.1206PartialContent
content-length=106786028
content-range=bytes2000070-106786027/106786028
date=mon,30apr200112:55:20gmt
etag=w/"02ca57e173c11:95b"
content-type=application/octet-stream
server=microsoft-iis/5.0
last-modified=mon,30apr200112:55:20gmt

和前面服务器返回的信息比较一下,就会发现增加了一行:

Content-Range=bytes2000070-106786027/106786028

返回的代码也改为206了,而不再是200了。

HTTP/1.1206PartialContent

知道了以上原理,就可以进行断点续传的编程了。

二、PHP实现

/**php下载类,支持断点续传
*download:下载文件

断点续传 java

*setSpeed:设置下载速度 *getRange:获取header中Range */ classFileDownload{ /**下载 *@paramString$file要下载的文件路径 *@paramString$name文件名称,为空则与下载的文件名称一样 *@paramboolean$reload是否开启断点续传 */ publicfunctiondownload($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.'"'); }elseif(preg_match("/Firefox/",$ua)){ header('Content-Disposition:attachment;filename*="utf8'''.$name.'"'); }elseif(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.1206PartialContent'); 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{

断点续传 java

file_put_contents('test.log','2222',FILE_APPEND); header('HTTP/1.1200OK'); header('content-length:'.$file_size); } while(!feof($fp)){ //echofread($fp,round($this->_speed*1024,0)); //echofread($fp,$file_size); echofread($fp,4096); ob_flush(); } ($fp!=null)&&fclose($fp); }else{ return''; } } /**设置下载速度 *@paramint$speed */ publicfunctionsetSpeed($speed){ if(is_numeric($speed)&&$speed>16&&$speed_speed=$speed; } } /**获取headerrange信息 *@paramint$file_size文件大小 *@returnArray */ privatefunctiongetRange($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)download('http://down.golaravel.com/laravel/laravel-master.zip','',true);

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » php实现断点续传大文件示例代码

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们