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 !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 PHP
php学习之变量的使用
May 29 PHP
PHP fopen 读取带中文URL地址的一点见解
Sep 25 PHP
php中删除字符串中最先出现某个字符的实现代码
Feb 03 PHP
php截取中文字符串不乱码的方法
Dec 25 PHP
smarty内置函数section的用法
Jan 22 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
CodeIgniter针对数据库的连接、配置及使用方法
Mar 03 PHP
php中简单的对称加密算法实现
Jan 05 PHP
PHP中for循环与foreach的区别
Mar 06 PHP
PHP实现json_decode不转义中文的方法
May 20 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 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
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
PHP 清空varnish 缓存的详解(包括指定站点下的)
2013/06/20 PHP
php实现改变图片直接打开为下载的方法
2015/04/14 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
Laravel框架模型的创建及模型对数据操作示例
2019/05/07 PHP
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
JavaScript的类型转换(字符转数字 数字转字符)
2010/08/30 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
Javascript中的对象和原型(二)
2016/08/12 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
微信小程序表单验证功能完整实例
2017/12/01 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
vue实现分页栏效果
2019/06/28 Javascript
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
2020/12/14 NodeJs
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
Python中序列的修改、散列与切片详解
2017/08/27 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
解决pycharm无法识别本地site-packages的问题
2018/10/13 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
竞聘上岗演讲稿范文
2014/01/10 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
浅谈sql_@SelectProvider及使用注意说明
2021/08/04 Java/Android
剖析后OpLog订阅MongoDB的数据变更就没那么难了
2022/02/24 MongoDB