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 相关文章推荐
SSI指令
Nov 25 PHP
火车头discuz6.1 完美采集的php接口文件
Sep 13 PHP
php session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
Nov 27 PHP
php 抽象类的简单应用
Sep 06 PHP
php注销代码(session注销)
May 31 PHP
深入解析php中的foreach问题
Jun 30 PHP
腾讯微博提示missing parameter errorcode 102 错误的解决方法
Dec 22 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
CI框架整合smarty步骤详解
May 19 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 PHP
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
Jan 25 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 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 和 XML: 使用expat函数(三)
2006/10/09 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP输出日历表代码实例
2015/03/27 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
原生js 秒表实现代码
2012/07/24 Javascript
js实现表格字段排序
2014/02/19 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
vue里如何主动销毁keep-alive缓存的组件
2019/03/21 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
Python解析网页源代码中的115网盘链接实例
2014/09/30 Python
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python与Redis的连接教程
2015/04/22 Python
python 循环遍历字典元素的简单方法
2016/09/11 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Django中的Signal代码详解
2018/02/05 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
解决Tensorflow安装成功,但在导入时报错的问题
2018/06/13 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
日本高岛屋百货购物网站:TAKASHIMAYA
2019/03/24 全球购物
校园联欢晚会主持词
2014/03/17 职场文书
小学教师年度个人总结
2015/02/05 职场文书
人力资源部岗位职责
2015/02/11 职场文书
2015年小学教导处工作总结
2015/05/26 职场文书
婚庆主持词大全
2015/06/30 职场文书
MySQL中order by的执行过程
2022/06/05 MySQL