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连接Access数据库的方法小结
Jun 20 PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 PHP
destoon实现调用图文新闻的方法
Aug 21 PHP
浅谈php优化需要注意的地方
Nov 27 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
Dec 17 PHP
PHP永久登录、记住我功能实现方法和安全做法
Apr 27 PHP
php猴子选大王问题解决方法
May 12 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
php通过baihui网API实现读取word文档并展示
Jun 22 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
php微信支付之公众号支付功能
May 30 PHP
tp5框架使用cookie加密算法实现登录功能示例
Feb 10 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基础学习之流程控制的实现分析
2013/04/28 PHP
Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
2014/05/04 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
JQuery实现简单的图片滑动切换特效
2015/11/22 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
JS原生数据双向绑定实现代码
2017/08/14 Javascript
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
javascript前端实现多视频上传
2020/12/13 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
用Python编写简单的定时器的方法
2015/05/02 Python
python 为什么说eval要慎用
2019/03/26 Python
python sqlite的Row对象操作示例
2019/09/11 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
Marriott国际:万豪国际酒店查询预订
2017/09/25 全球购物
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
EJB3推出JPA的原因
2013/10/16 面试题
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
商务经理岗位职责
2014/08/03 职场文书
公司租车协议书
2015/01/29 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
幼儿园教师岗位职责
2015/04/02 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
法律意见书范文
2015/06/04 职场文书
收入证明申请书
2015/06/12 职场文书
2015年国庆节新闻稿
2015/07/18 职场文书
2015党建工作简报
2015/07/21 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js