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 相关文章推荐
Oracle Faq(Oracle的版本)
Oct 09 PHP
php 信息采集程序代码
Mar 17 PHP
php 图片加水印与上传图片加水印php类
May 12 PHP
php explode函数实例代码
Feb 27 PHP
php文本转图片自动换行的方法
Mar 13 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 PHP
详解PHP归并排序的实现
Oct 18 PHP
PHP5.6新增加的可变函数参数用法分析
Aug 25 PHP
PHP实现网站访问量计数器
Oct 27 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
PHP开发api接口安全验证操作实例详解
Mar 26 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
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
又拍云异步上传实例教程详解
2016/04/19 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
学习ExtJS border布局
2009/10/08 Javascript
jquery 批量上传图片实现代码
2010/01/28 Javascript
javascript 表格内容排序 简单操作示例代码
2014/01/03 Javascript
再次谈论Javascript中的this
2016/06/23 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
浅谈键盘上回车按钮的js触发事件
2017/02/13 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
vue elementui form表单验证的实现
2018/11/11 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
python实现文件名批量替换和内容替换
2014/03/20 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
简单实现python收发邮件功能
2018/01/05 Python
分析Python中解析构建数据知识
2018/01/20 Python
python递归实现快速排序
2018/08/18 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
详解pandas.DataFrame.plot() 画图函数
2020/06/14 Python
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
学校地质灾害防治方案
2014/06/10 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python