phpダウンロードクラス

3930 ワード

$obj = new FileDownload();
$flag = $obj->download($fileUrl, $fileName);//fileUrl     ,fileName                   :hello.mp4

class FileDownload{
   /**   
    * @param String  $file           
    * @param String  $name       ,             
    * @param boolean $reload         
    */
    public function download($file, $name='', $reload=false){
        $fp = @fopen($file, 'rb');
		if($fp){
            if($name==''){
                $name = basename($file);
            }        
			$header_array = get_headers($file, true);
			$file_size = $header_array['Content-Length'];
            $ranges = $this->getRange($file_size);
			
            $ua = $_SERVER["HTTP_USER_AGENT"];//          
			
            header('cache-control:public');
            header('content-type:application/octet-stream');
			
            $encoded_filename = urlencode($name);			
			$encoded_filename = str_replace("+", "%20", $encoded_filename);
           
		    //         
			if (preg_match("/MSIE/", $ua) ||  preg_match("/Trident/", $ua) ){				
				header('Content-Disposition: attachment; filename="' .$encoded_filename . '"');
			} else if (preg_match("/Firefox/", $ua)) {
				header('Content-Disposition: attachment; filename*="utf8\'\'' . $name . '"');
			}else if (preg_match("/Chrome/", $ua)) {
				header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
			} else {
				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)){
				ob_clean();
				echo fread($fp, 4096);
                //echo fread($fp, round($this->_speed*1024,0));
                //echo fread($fp, $file_size);
                ob_flush();
            }


            ($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;
    }
}