php实现断点续传大文件的案例

  介绍

这篇文章将为大家详细讲解有关php实现断点续传大文件的案例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

<强>一、断点续传原理

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

不使用断点续传

get /down.zip  HTTP/1.1   接受:图像/gif,图像/x-xbitmap,图像/jpeg,图像/pjpeg、应用程序/vnd.ms -   应用程序/msword, excel,,应用程序/vnd.ms-powerpoint, */*   接收语言:应用   接受编码:gzip、缩小   用户代理:mozilla/4.0,(兼容;,msie  5.01;, windows  nt  5.0)   连接:维生

,服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:

HTTP/1.1, 200,好吧   内容长度=106786028   accept-ranges=字节=我的约会,,30,apr  2001年,12:56:11 格林尼治时间   etag=w/?2 ca57e173c11:95b"   应用程序/八进制- type=服务器=microsoft iis/5.0   last - modified=mon, 30, apr  2001年,12:56:11 格林尼治时间

使用断点续传

GET /down.zip  HTTP/1.0   用户代理:NetFox   范围:字节=2000070 -   接受:text/html,图像/gif,图像/jpeg, *,, q=2, */*; q=?

多了这么一行<代码>范围:字节=2000070 -

这一行的意思就是告诉服务器。邮政这个文件从2000070字节开始传,前面的字节不用传了。
范围的完整格式是:

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

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

HTTP/1.1, 206, Partial 内容   内容长度=106786028   含量=bytes  2000070 - 106786027/106786028=我的约会,,30,apr  2001年,12:55:20 格林尼治时间   etag=w/?2 ca57e173c11:95b"   应用程序/八进制- type=服务器=microsoft iis/5.0   last - modified=mon, 30, apr  2001年,12:55:20 

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

含量=bytes  2000070——106786027/106786028

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

HTTP/1.1, 206, Partial 内容

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

二,php实现

/* *, php下载类,支持断点续传   ,*下载:下载文件   ,* setSpeed:设置下载速度   ,* getRange:获取头中   ,*/,   class  FileDownload {   ,   ,/* *下载   ,* @param  String  file 美元;要下载的文件路径   ,* @param  String  name 美元;文件名称,为空则与下载的文件名称一样   ,* @param  boolean  reload 美元;是否开启断点续传   ,*/,public  function 下载($文件,$ name=& # 39; & # 39;,,美元重载=false) {   ,fp 美元;=,@fopen(文件,美元,& # 39;rb # 39;);   ,如果美元(fp) {   ,如果($ name==& # 39; & # 39;) {   ,name 美元;=,basename($文件);   ,}   ,header_array 美元;=,get_headers($文件,真的);   ,//var_dump ($ header_array);死亡;   ,//下载本地文件,获取文件大小   ,if  (! $ header_array), {   ,file_size 美元;=,文件大小($文件);   ,}else  {   美元,美元file_size =, header_array[& # 39;内容长度# 39;];   ,}   美元,美元ranges =,这→getRange ($ file_size);=,美元ua  $ _SERVER (“HTTP_USER_AGENT");//判断是什么类型浏览器   ,头(& # 39;cache - control:公共# 39;);   ,头(& # 39;内容类型:应用程序/八进制# 39;),,   ,   ,encoded_filename 美元;=,urlencode($名称);   ,encoded_filename 美元;=,str_replace (“+”,,“% 20,,, encoded_filename美元);   ,   ,//解决下载文件名乱码   ,if  (preg_match (“/MSIE/,,, ua美元),| |,preg_match(“三叉戟”/?,ua美元),){,   ,头(& # 39;附加项:,附件;,文件名=? # 39;,encoded_filename 美元;只& # 39;“& # 39;);   ,}else  if  (preg_match (“/Firefox/,,, ua美元)),{   ,头(& # 39;附加项:,附件;,文件名*=皍se utf8 \ & # 39; \ & # 39; & # 39;,只name 美元;只& # 39;“& # 39;);   ,}else  if  (preg_match(“/铬/,,,ua美元)),{   ,头(& # 39;附加项:,附件;,文件名=? # 39;,只encoded_filename 美元;只& # 39;“& # 39;);   ,}else  {   ,头(& # 39;附加项:,附件;,文件名=? # 39;,只name 美元;只& # 39;“& # 39;);   ,}   ,//头(& # 39;附加项:,附件;,文件名=? # 39;,只name 美元;只& # 39;“& # 39;);   ,   ,如果(reload 美元;,,,美元范围!=null){//大敌;使用续传   ,头(& # 39;HTTP/1.1, 206, Partial 内容# 39;);   ,头(& # 39;Accept-Ranges:字节# 39;);   ,   ,//剩余长度   ,头(sprintf(& # 39;内容长度:% u # 39;,美元范围[& # 39;结束# 39;]美元范围[& # 39;开始# 39;]));   ,   ,//范围信息   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

php实现断点续传大文件的案例