<?php  
/** php下载类,支持断点续传 
*   Func: 
*   download: 下载文件 
*   setSpeed: 设置下载速度 
*   getRange: 获取header中Range 
*/  
class FileDownload{ // class start  
    private $_speed = 512;   // 下载速度  
    /** 下载 
    * @param String  $file   要下载的文件路径 
    * @param String  $name   文件名称,为空则与下载的文件名称一样 
    * @param boolean $reload 是否开启断点续传 
    */  
    public function download($file, $name='', $reload=false){  
        if(file_exists($file)){  
            if($name==''){  
                $name = basename($file);  
            }  
            $fp = fopen($file, 'rb');  
            $file_size = filesize($file);  
            
            $ranges = $this->getRange($file_size);  
            header('cache-control:public');  
            header('content-type:application/octet-stream');  
            header('content-disposition:attachment; filename='.$name);  
            if($reload && $ranges!=null){ // 使用续传  
                header('HTTP/1.1 206 Partial Content');  
                header('Accept-Ranges:bytes');  
                // 剩余长度  
                header(sprintf('content-length:%u',$ranges['end']-$ranges['start']));  
                // range信息  
                header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size));  
                // fp指针跳到断点位置  
                fseek($fp, sprintf('%u', $ranges['start']));  
            }else{  
                header('HTTP/1.1 200 OK');  
                header('content-length:'.$file_size);  
            }  
            while(!feof($fp)){  
                echo fread($fp, round($this->_speed*1024,0));  
                ob_flush();  
                sleep(1); // 用于测试,减慢下载速度  
            }  
            ($fp!=null) && fclose($fp);  
        }else{  
            return '';  
        }  
    }  
    /** 设置下载速度 
    * @param int $speed 
    */  
    public function setSpeed($speed){  
        if(is_numeric($speed) && $speed>16 && $speed<4096){  
            $this->_speed = $speed;  
        }  
    }  
  
  
    /** 获取header range信息 
    * @param  int   $file_size 文件大小 
    * @return Array 
    */  
    private function getRange($file_size){  
        if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])){  
            $range = $_SERVER['HTTP_RANGE'];  
            $range = preg_replace('/[\s|,].*/', '', $range);  
            $range = explode('-', substr($range, 6));  
            if(count($range)<2){  
                $range[1] = $file_size;  
            }  
            $range = array_combine(array('start','end'), $range);  
            if(empty($range['start'])){  
                $range['start'] = 0;  
            }  
            if(empty($range['end'])){  
                $range['end'] = $file_size;  
            }  
            return $range;  
        }  
        return null;  
    }  
}
$file = 'book.zip';  
$name = time().'.zip';  
$obj = new FileDownload();  
$flag = $obj->download($file, $name);  
//$flag = $obj->download($file, $name, true); // 断点续传  
if(!$flag){  
    echo 'file not exists';  
}  
?>

DEMO下载地址:https://dwz.cn/ORcEz9fz

php大文件下载支持断点续传的更多相关文章

  1. 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控

    参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html  ...

  2. 【nginx】记录nginx+php-fpm实现大文件下载排坑的过程

    先上一段代码,支持大文件下载和断点续传,代码来源互联网. set_time_limit(0); // 省略取文件路径的过程,这里直接是文件完整路径 $filePath = get_save_path( ...

  3. Java单线程文件下载,支持断点续传功能

    前言: 程序下载文件时,有时会因为各种各样的原因下载中断,对于小文件来说影响不大,可以快速重新下载,但是下载大文件时,就会耗费很长时间,所以断点续传功能对于大文件很有必要. 文件下载的断点续传: 1. ...

  4. php 支持断点续传的文件下载类

    php 支持断点续传的文件下载类 分类: php class2013-06-30 17:27 17748人阅读 评论(6) 收藏 举报 php断点续传下载http测试 php 支持断点续传,主要依靠H ...

  5. web大附件上传,支持断点续传

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  6. java大附件上传,支持断点续传

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  7. php大文件下载+断点续传

    如果我们的网站提供文件下载的服务,那么通常我们都希望下载可以断点续传(Resumable Download),也就是说用户可以暂停下载,并在未来的某个时间从暂停处继续下载,而不必重新下载整个文件. 通 ...

  8. php实现的支持断点续传的文件下载类

    通常来说,php支持断点续传,主要依靠HTTP协议中 header HTTP_RANGE实现. HTTP断点续传原理: Http头 Range.Content-Range()HTTP头中一般断点下载时 ...

  9. iOS中的下载管理器(支持断点续传)

    在空闲时间自己编写了一个简单的iOS下载管理器.该管理器实现如下功能: 1.能够支持正常的下载,暂停,继续操作. 2.支持断点续传,实现暂停执行继续操作后,依然能正常将文件下载完成. 3.实现实时状态 ...

随机推荐

  1. Linux移植之配置过程分析

    在Linux移植之移植步骤中已经将Linux移植的过程罗列出来了,现在分析一下Linux的配置过程,将分析以下两个配置过程: 1.make s3c2410_defconfig分析 2.make men ...

  2. Informatica_(6)性能调优

    六.实战汇总31.powercenter 字符集 了解源或者目标数据库的字符集,并在Powercenter服务器上设置相关的环境变量或者完成相关的设置,不同的数据库有不同的设置方法: 多数字符集的问题 ...

  3. ftp上传文件异常

    ftp一个服务器 如果是22端口 ssh-2.0-openssh_4.3 ,是什么意思? ftp服务用的是20.21端口,客户端添加ftp信息的时候输入的是21端口 ssh服务用的是22端口,应用于远 ...

  4. Android开发之炫酷MD风格

    文章转自:一点点征服的 http://www.cnblogs.com/ldq2016/p/5217590.html 安卓开发中非常炫的效果集合 这几天开发的时候,想做一些好看而且酷炫的特效,于是又开始 ...

  5. Maven 系列 一 :Maven 快速入门及简单使用

    开发环境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什么是Maven? Maven是一个项目管理工具,主要用于项目构建,依赖管理,项目信息管理. 2.下载及安装 下载最 ...

  6. Java.FamousBlogs

    本文总结在工作/学习中发现的Java相关的blogs. 1. java code geeks (jcg) http://www.javacodegeeks.com/join-us/jcg/ 2. ht ...

  7. iOS.KVC.setValue:forKey:

    Foundation Framework 定义了 NSObject(NSKeyValueCoding), - (void)setValue:(id)value forKey:(NSString *)k ...

  8. Codeforces 787D. Legacy 线段树建模+最短路

    D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  9. wifi功能模块

    1. API 10 Android2.3.3 不支持wifi代理设置. 2017-09-29 原来addOrUpdateNetwork之前,wifi配置并不会立即生效,要想立即生效,就要 wifiMa ...

  10. 在离线安装gazebo的时候可能在运行turtlebot_gazebo的时候会出现问题

    问题显示如下 gzserver: /build/ogre-1.9-mqY1wq/ogre-1.9-1.9.0+dfsg1/OgreMain/src/OgreRenderSystem.cpp:546: ...