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 相关文章推荐
一个odbc连mssql分页的类
Oct 09 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
Oct 31 PHP
php地址引用(php地址引用的效率问题)
Mar 23 PHP
分享PHP header函数使用教程
Sep 05 PHP
PHP比你想象的好得多
Nov 27 PHP
ThinkPHP内置jsonRPC的缺陷分析
Dec 18 PHP
php常量详细解析
Oct 27 PHP
讲解WordPress开发中一些常用的debug技巧
Dec 18 PHP
PHP中递归的实现实例详解
Nov 14 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
Sep 04 PHP
PHP实现基本留言板功能原理与步骤详解
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
用PHP的ob_start() 控制您的浏览器cache
2009/08/03 PHP
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
ThinkPHP安装和设置
2015/07/27 PHP
Jquery 弹出层插件实现代码
2009/10/24 Javascript
javascript 面向对象全新理练之继承与多态
2009/12/03 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
JavaScript使用replace函数替换字符串的方法
2015/04/06 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
浅谈Vue.js
2017/03/02 Javascript
利用types增强vscode中js代码提示功能详解
2017/07/07 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
关于vue-router的那些事儿
2018/05/23 Javascript
Vue组件全局注册实现警告框的实例详解
2018/06/11 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
校园安全广播稿
2014/02/08 职场文书
新教师培训方案
2014/06/08 职场文书
计算机软件专业求职信
2014/06/10 职场文书
药店促销活动策划方案
2014/08/24 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
Spring Cloud OpenFeign模版化客户端
2022/06/25 Java/Android