• php断点续传


     1 class FileDownload{ // class start 
     2   
     3   private $_speed = 512;  // 下载速度 
     4   
     5   /** 下载 
     6   * @param String $file  要下载的文件路径 
     7   * @param String $name  文件名称,为空则与下载的文件名称一样 
     8   * @param boolean $reload 是否开启断点续传 
     9   */
    10   public function download($file, $name='', $reload=false){ 
    11     if(file_exists($file)){ 
    12       if($name==''){ 
    13         $name = basename($file); 
    14       } 
    15   
    16       $fp = fopen($file, 'rb'); 
    17       $file_size = filesize($file); 
    18       $ranges = $this->getRange($file_size); 
    19   
    20       header('cache-control:public'); 
    21       header('content-type:application/octet-stream'); 
    22       header('content-disposition:attachment; filename='.$name); 
    23   
    24       if($reload && $ranges!=null){ // 使用续传 
    25         header('HTTP/1.1 206 Partial Content'); 
    26         header('Accept-Ranges:bytes'); 
    27           
    28         // 剩余长度 
    29         header(sprintf('content-length:%u',$ranges['end']-$ranges['start'])); 
    30           
    31         // range信息 
    32         header(sprintf('content-range:bytes %s-%s/%s', $ranges['start'], $ranges['end'], $file_size)); 
    33           
    34         // fp指针跳到断点位置 
    35         fseek($fp, sprintf('%u', $ranges['start'])); 
    36       }else{ 
    37         header('HTTP/1.1 200 OK'); 
    38         header('content-length:'.$file_size); 
    39       } 
    40   
    41       while(!feof($fp)){ 
    42         echo fread($fp, round($this->_speed*1024,0)); 
    43         ob_flush(); 
    44         //sleep(1); // 用于测试,减慢下载速度 
    45       } 
    46   
    47       ($fp!=null) && fclose($fp); 
    48   
    49     }else{ 
    50       return ''; 
    51     } 
    52   } 
    53   
    54   /** 设置下载速度 
    55   * @param int $speed 
    56   */
    57   public function setSpeed($speed){ 
    58     if(is_numeric($speed) && $speed>16 && $speed<4096){ 
    59       $this->_speed = $speed; 
    60     } 
    61   } 
    62   
    63   /** 获取header range信息 
    64   * @param int  $file_size 文件大小 
    65   * @return Array 
    66   */
    67   private function getRange($file_size){ 
    68     if(isset($_SERVER['HTTP_RANGE']) && !empty($_SERVER['HTTP_RANGE'])){ 
    69       $range = $_SERVER['HTTP_RANGE']; 
    70       $range = preg_replace('/[s|,].*/', '', $range); 
    71       $range = explode('-', substr($range, 6)); 
    72       if(count($range)<2){ 
    73         $range[1] = $file_size; 
    74       } 
    75       $range = array_combine(array('start','end'), $range); 
    76       if(empty($range['start'])){ 
    77         $range['start'] = 0; 
    78       } 
    79       if(empty($range['end'])){ 
    80         $range['end'] = $file_size; 
    81       } 
    82       return $range; 
    83     } 
    84     return null; 
    85   } 
    86 } 
  • 相关阅读:
    git 的分支体系命令汇总
    git命令行学习思路总结
    angular1.5版本的自我认识
    我最想去的公司啊 -- 幸福面试两小时
    【转】【Asp.Net MVC】asp.net mvc Model验证总结及常用正则表达式
    时间被序列化后的页面显示的问题
    JS组件Bootstrap实现弹出框和提示框效果代码
    Bootstrap组件之导航条
    Bootstrap学习笔记(四)-----Bootstrap每天必学之表单
    Bootstrap学习笔记(三)-----Bootstrap每天必学之表格
  • 原文地址:https://www.cnblogs.com/tm2015/p/4739634.html
Copyright © 2020-2023  润新知