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 相关文章推荐
Win9x/ME下Apache+PHP安装配置
Oct 09 PHP
自动跳转中英文页面
Oct 09 PHP
PHP 组件化编程技巧
Jun 06 PHP
php学习笔记 面向对象的构造与析构方法
Jun 13 PHP
php设计模式 Delegation(委托模式)
Jun 26 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
destoon常用的安全设置概述
Jun 21 PHP
CodeIgniter框架数据库事务处理的设计缺陷和解决方案
Jul 25 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
PHP使用stream_context_create()模拟POST/GET请求的方法
2016/04/02 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
php工具型代码之印章抠图
2018/07/18 PHP
PHP编程一定要改掉的5个不良习惯
2020/09/18 PHP
Firefox+FireBug使JQuery的学习更加轻松愉快
2010/01/01 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
说说Vuex的getters属性的具体用法
2019/04/15 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
Python实现的几个常用排序算法实例
2014/06/16 Python
Python sys.argv用法实例
2015/05/28 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
Python之列表实现栈的工作功能
2019/01/28 Python
通过python检测字符串的字母
2020/02/18 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
英国在线滑雪板和冲浪商店:The Board Basement
2020/01/11 全球购物
"序列点" 是什么
2016/07/29 面试题
Android面试题及答案
2015/09/04 面试题
小学安全教育材料
2014/02/17 职场文书
公司行政主管岗位职责
2015/04/09 职场文书
信用卡催款律师函
2015/05/27 职场文书
辞职信怎么写?你都知道吗?
2019/06/24 职场文书