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调用三种数据库的方法(1)
Oct 09 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
Apr 18 PHP
浅析PHP原理之变量(Variables inside PHP)
Aug 09 PHP
体育彩票排列三组选三算法分享
Mar 07 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
Zend Framework前端控制器用法示例
Dec 11 PHP
详解Yii2高级版引入bootstrap.js的一个办法
Mar 21 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
PHPMAILER实现PHP发邮件功能
Apr 18 PHP
php操作mongodb封装类与用法实例
Sep 01 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 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 gzip压缩输出的实现方法
2013/04/27 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
php连接与操作PostgreSQL数据库的方法
2014/12/25 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
php unicode编码和字符串互转的方法
2020/08/12 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
IE和Firefox下event事件杂谈
2009/12/18 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
Bootstrap 3多级下拉菜单实例
2017/11/23 Javascript
vue 表单验证按钮事件交由父组件触发的方法
2018/12/17 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
在vue项目中promise解决回调地狱和并发请求的问题
2020/11/09 Javascript
python实现用户管理系统
2018/01/10 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
对python opencv 添加文字 cv2.putText 的各参数介绍
2018/12/05 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
Pycharm配置lua编译环境过程图解
2020/11/28 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
Lyle & Scott苏格兰金鹰官网:英国皇室御用品牌
2018/05/09 全球购物
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
教师实习自我鉴定
2013/12/13 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
支部组织生活会方案
2014/06/10 职场文书
党的生日演讲稿
2014/09/10 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
董事长年会致辞
2015/07/29 职场文书
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技