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 empty(),isset(),is_null()的实例测试详解
Jun 06 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
Sep 22 PHP
10个实用的PHP正则表达式汇总
Oct 23 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
PHP+apc+ajax实现的ajax_upload上传进度条代码
Jan 25 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 PHP
laravel 框架实现无限级分类的方法示例
Oct 31 PHP
基于PHP实现堆排序原理及实例详解
Jun 19 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
国内咖啡文化
2021/03/03 咖啡文化
PHP数字格式化
2006/12/06 PHP
PHP中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP 各种排序算法实现代码
2009/08/20 PHP
高性能PHP框架Symfony2经典入门教程
2014/07/08 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
你的编程语言可以这样做吗?
2006/09/07 Javascript
jquery无刷新验证邮箱地址实现实例
2014/02/19 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
python实现校园网自动登录的示例讲解
2018/04/22 Python
python实现Zabbix-API监控
2018/09/17 Python
python 读取修改pcap包的例子
2019/07/23 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
介绍下WebSphere的安全性
2013/01/31 面试题
总经理助理工作职责
2014/02/06 职场文书
创先争优承诺书范文
2014/03/31 职场文书
主题实践活动总结
2014/05/08 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
个人原因辞职信模板
2015/05/13 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL