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输出控制功能在简繁体转换中的应用
Oct 09 PHP
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
php数字转汉字代码(算法)
Oct 08 PHP
destoon常用的安全设置概述
Jun 21 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
php限制ip地址范围的方法
Mar 31 PHP
php语言的7种基本的排序方法
Dec 28 PHP
PHP调用Mailgun发送邮件的方法
May 04 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 PHP
PHP PDOStatement::fetch讲解
Jan 31 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 PHP
laravel5.0在linux下解决.htaccess无效和去除index.php的问题
Oct 16 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
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
第十五节--Zend引擎的发展
2006/11/16 PHP
PHP与SQL注入攻击[一]
2007/04/17 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
javascrip关于继承的小例子
2013/05/10 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
javascript实现动态显示颜色块的报表效果
2017/04/10 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
Python SQLAlchemy入门教程(基本用法)
2019/11/11 Python
详解Flask前后端分离项目案例
2020/07/24 Python
什么是ESB?请介绍一下ESB?
2015/05/27 面试题
生产管理的三大手法
2013/11/11 职场文书
森林防火工作方案
2014/02/14 职场文书
运动会演讲稿
2014/05/07 职场文书
2014国庆节国旗下演讲稿(精选版)
2014/09/26 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
廉洁自律个人总结
2015/02/14 职场文书
党校培训学习心得体会
2016/01/06 职场文书
人生感悟经典句子
2019/08/20 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
进行数据处理的6个 Python 代码块分享
2022/04/06 Python
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang