断点续传

public function getA($file, $name='', $reload=false)
{
    $fp = @fopen($file, 'r+');
    if($fp){
        if($name==''){
            $name = basename($file);
        }
        $header_array = get_headers($file, true);
        //var_dump($header_array);die;
        // 下载本地文件,获取文件大小
        if (!$header_array) {
            $file_size = filesize($file);
        } else {
            $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 . '"');
        }
        //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));
            //file_put_contents('test.log',sprintf('content-length:%u',$ranges['end']-$ranges['start']),FILE_APPEND);
            // fp指针跳到断点位置
            fseek($fp, sprintf('%u', $ranges['start']));
        }else{
            file_put_contents('test.log','2222',FILE_APPEND);
            header('HTTP/1.1 200 OK');
            header('content-length:'.$file_size);
        }

        while(!feof($fp)){
            //echo fread($fp, round($this->_speed*1024,0));
            //echo fread($fp, $file_size);
            echo fread($fp, 4096);
            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){
    //file_put_contents('range.log', json_encode($_SERVER), FILE_APPEND);
    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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值