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数组实现无限分类,不使用数据库,不使用递归.
Dec 09 PHP
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
Apr 12 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
Dec 19 PHP
支持中文字母数字、自定义字体php验证码代码
Feb 27 PHP
比较好用的PHP防注入漏洞过滤函数代码
Apr 11 PHP
深入PHP运行环境配置的详解
Jun 04 PHP
PHP实现XML与数据格式进行转换类实例
Jul 29 PHP
抛弃 PHP 代价太高
Apr 26 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
详解PHP防止直接访问.php 文件的实现方法
Jul 28 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
解决Laravel5.5下的toArray问题
Oct 15 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.0框架模型多表关联查询示例
2019/07/18 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
详解Layer弹出层样式
2017/08/21 Javascript
JavaScript实现图片拖曳效果
2017/09/08 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
Vue代码整洁之去重方法整理
2019/08/06 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
2020/03/03 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python 绘图和可视化详细介绍
2017/02/11 Python
安装Python的教程-Windows
2017/07/22 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
python中有关时间日期格式转换问题
2019/12/25 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
Python如何获取文件指定行的内容
2020/05/27 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
内蒙古鄂尔多斯市市长寄语
2014/04/10 职场文书
机械专业求职信范文
2014/07/15 职场文书
海洋科学专业求职信
2014/08/10 职场文书
考试保密承诺书
2014/08/30 职场文书
创先争优活动承诺书
2014/08/30 职场文书
大学辅导员述职报告
2015/01/10 职场文书
教师节寄语2015
2015/03/23 职场文书
2016公司年会通知范文
2015/04/25 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS