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函数
Jan 11 PHP
PHP使用CURL获取302跳转后的地址实例
May 04 PHP
codeigniter发送邮件并打印调试信息的方法
Mar 21 PHP
PHP中trim()函数简单使用指南
Apr 16 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
PHP文件上传类实例详解
Apr 08 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
php实现解析xml并生成sql语句的方法
Feb 03 PHP
PHP PDOStatement::closeCursor讲解
Jan 30 PHP
Yii 框架控制器创建使用及控制器响应操作示例
Oct 14 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
Yii2单元测试用法示例
2016/11/12 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
PHP7变量处理机制修改
2021/03/09 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
jQuery实现摸拟alert提示框
2016/05/22 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
vue 动态生成拓扑图的示例
2021/01/03 Vue.js
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
python 随机生成10位数密码的实现代码
2019/06/27 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python文件操作基础流程解析
2020/03/19 Python
python实现控制台输出彩色字体
2020/04/05 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
校长就职演讲稿
2014/01/06 职场文书
校长先进事迹材料
2014/02/01 职场文书
教师学习培训邀请函
2014/02/04 职场文书
会议主持人开场白台词
2015/05/28 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers
Golang gRPC HTTP协议转换示例
2022/06/16 Golang