php大文件下載支持斷點續傳

<?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/ORcEz9fzphp

相關文章
相關標籤/搜索