php 续传 下载类

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值