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 相关文章推荐
ajax实现无刷新分页(php)
Jul 18 PHP
PHP设计模式 注册表模式
Feb 05 PHP
php curl 上传文件代码实例
Apr 27 PHP
php计算多维数组中所有值总和的方法
Jun 24 PHP
PHP中COOKIES使用示例
Jul 26 PHP
利用php输出不同的心形图案
Apr 22 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
如何直接访问php实例对象中的private属性详解
Oct 12 PHP
PHP实现通过CURL上传文件功能示例
May 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
php5 mysql分页实例代码
2008/04/10 PHP
调整PHP的性能
2013/10/30 PHP
php制作动态随机验证码
2015/02/12 PHP
利用“多说”制作留言板、评论系统
2015/07/14 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
2016年最热门的15 款代码语法高亮工具,美化你的代码
2016/01/06 Javascript
jQuery实现图片向左向右切换效果的简单实例
2016/05/18 Javascript
JS判断是否在微信浏览器打开的简单实例(推荐)
2016/08/24 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
python3.5 email实现发送邮件功能
2018/05/22 Python
对Python中数组的几种使用方法总结
2018/06/28 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
周仰杰(JIMMY CHOO)法国官方网站:闻名世界的鞋子品牌
2019/09/27 全球购物
电子信息工程专业推荐信
2014/02/14 职场文书
美食节目策划方案
2014/05/31 职场文书
村道德模范事迹材料
2014/08/28 职场文书
2014年教研室工作总结
2014/12/06 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
五年级作文之想象作文
2019/10/30 职场文书
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers