PHP实现下载断点续传的方法


Posted in PHP onNovember 12, 2014

本文实例讲述了PHP实现下载断点续传的方法。分享给大家供大家参考。

具体实现代码如下:

<?php 

/*

 * PHP下载断点续传

 */

function dl_file_resume($file){ 

 

    //检测文件是否存在 

    if (!is_file($file)) { die("<b>404 File not found!</b>"); } 

      

    $len = filesize($file);//获取文件大小 

    $filename = basename($file);//获取文件名字 

    $file_extension = strtolower(substr(strrchr($filename,"."),1));//获取文件扩展名 

      

    //根据扩展名 指出输出浏览器格式 

    switch( $file_extension ) { 

        case "exe": $ctype="application/octet-stream"; break; 

        case "zip": $ctype="application/zip"; break; 

        case "mp3": $ctype="audio/mpeg"; break; 

        case "mpg":$ctype="video/mpeg"; break; 

        case "avi": $ctype="video/x-msvideo"; break; 

        default: $ctype="application/force-download"; 

    } 

      

    //Begin writing headers 

    header("Cache-Control:"); 

    header("Cache-Control: public"); 

      

    //设置输出浏览器格式 

    header("Content-Type: $ctype"); 

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {//如果是IE浏览器 

        # workaround for IE filename bug with multiple periods / multiple dots in filename 

        # that adds square brackets to filename - eg. setup.abc.exe becomes setup[1].abc.exe 

        $iefilename = preg_replace('/\./', '%2e', $filename, substr_count($filename, '.') - 1); 

        header("Content-Disposition: attachment; filename=\"$iefilename\""); 

    } else { 

        header("Content-Disposition: attachment; filename=\"$filename\""); 

    } 

    header("Accept-Ranges: bytes"); 

      

    $size=filesize($file); 

    //如果有$_SERVER['HTTP_RANGE']参数 

    if(isset($_SERVER['HTTP_RANGE'])) { 

/*   --------------------------- 

   Range头域 Range头域可以请求实体的一个或者多个子范围。例如, 
表示头500个字节:bytes=0-499 
表示第二个500字节:bytes=500-999 
表示最后500个字节:bytes=-500 
表示500字节以后的范围:bytes=500- 
第一个和最后一个字节:bytes=0-0,-1 
同时指定几个范围:bytes=500-600,601-999 
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。 

   ---------------------------*/

    

// 断点后再次连接 $_SERVER['HTTP_RANGE'] 的值 bytes=4390912- 

    

        list($a, $range)=explode("=",$_SERVER['HTTP_RANGE']); 

   //if yes, download missing part 

        str_replace($range, "-", $range);//这句干什么的呢。。。。 

   $size2=$size-1;//文件总字节数 

        $new_length=$size2-$range;//获取下次下载的长度 

        header("HTTP/1.1 206 Partial Content"); 

        header("Content-Length: $new_length");//输入总长 

        header("Content-Range: bytes $range$size2/$size");//Content-Range: bytes 4908618-4988927/4988928   95%的时候 

    } else {//第一次连接 

        $size2=$size-1; 

        header("Content-Range: bytes 0-$size2/$size"); //Content-Range: bytes 0-4988927/4988928 

        header("Content-Length: ".$size);//输出总长 

    } 

    //打开文件 

    $fp=fopen("$file","rb"); 

    //设置指针位置 

    fseek($fp,$range); 

    //虚幻输出 

    while(!feof($fp)){ 

        //设置文件最长执行时间 

        set_time_limit(0); 

        print(fread($fp,1024*8));//输出文件 

        flush();//输出缓冲 

        ob_flush(); 

    } 

    fclose($fp); 

    exit; 

} 

 

dl_file_resume("1.zip");//同级目录的1.zip 文件 

 

//---------------------------------------

 

//不支持断点续传的文件下载。 

 

//---------------------------------------

  

downFile("1.zip"); 

 

function downFile($sFilePath) 

{ 

   if(file_exists($sFilePath)){ 

       $aFilePath=explode("/",str_replace("\\","/",$sFilePath),$sFilePath); 

       $sFileName=$aFilePath[count($aFilePath)-1]; 

       $nFileSize=filesize ($sFilePath); 

       header ("Content-Disposition: attachment; filename=" . $sFileName); 

       header ("Content-Length: " . $nFileSize); 

       header ("Content-type: application/octet-stream"); 

       readfile($sFilePath); 

   } 

   else

   { 

       echo("文件不存在!"); 

   } 

} 

?>

希望本文所述对大家的PHP程序设计有所帮助。

PHP 相关文章推荐
PHP新手上路(九)
Oct 09 PHP
php横向重复区域显示二法
Sep 25 PHP
兼容性比较好的PHP生成缩略图的代码
Jan 12 PHP
php强制下载类型的实现代码
Apr 21 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
Aug 31 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
用PHP解决的一个栈的面试题
Jul 02 PHP
功能强大的php分页函数
Jul 20 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 05 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
PHP程序守护进程化实现方法详解
Jul 16 PHP
php格式化日期实例分析
Nov 12 #PHP
PHP中的Streams详细介绍
Nov 12 #PHP
PHP产生不重复随机数的5个方法总结
Nov 12 #PHP
php一行代码获取文件后缀名实例分析
Nov 12 #PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 #PHP
php实现的css文件背景图片下载器代码
Nov 11 #PHP
PHP获取数组中重复最多的元素的实现方法
Nov 11 #PHP
You might like
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
javascript读写json示例
2014/04/11 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
原生JS实现音乐播放器
2021/01/26 Javascript
Python写的服务监控程序实例
2015/01/31 Python
python3抓取中文网页的方法
2015/07/28 Python
Python ldap实现登录实例代码
2016/09/30 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
python matplotlib拟合直线的实现
2019/11/19 Python
Python守护进程实现过程详解
2020/02/10 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
心得体会范文
2014/01/04 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
学习党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
民事赔偿协议书
2014/11/02 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
安全教育日主题班会
2015/08/13 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android