php输出字节流(本节以音频播放为例)

本教程是在ThinkPHP5.0中进行的,如用在其它程序中,作少量修改即可。

    /**
     * 以文件流输出音频文件
     * @author Sindsun
     * @date 2018年10月27日22:32:17
     * @param $filePath 文件地址
     * @param $param 其它参数
     * @param $fun 执行一个闭包函数  第一个参数为外部参数
     * @output filestream
     * @return bool
     * */
    public function outputStream($filePath,$clientSectionInfo){
        if(!file_exists($filePath)){
            return false;
        }
        //返回的文件(流形式)
        //对照的完整地址推荐:http://tool.oschina.net/commons/
        //header("Content-type: application/octet-stream");
        //header("Content-type: audio/mp3");
		header("Content-type: audio/mpeg");
		header("Age:0");
        //按照字节大小返回
        //header("Accept-Ranges: bytes");
        $fileSize = filesize($filePath);
        //$httpRange = $this->request->header('HTTP_RANGE');
		$httpRange = $this->request->header('Range');
		if(empty($httpRange)){
			$httpRange = $this->request->header('HTTP_RANGE');
		}
        if(!empty($httpRange)){
            header("HTTP/1.1 206 Partial Content");
            list($name, $range) = explode("=", $httpRange);
            list($begin, $end) =explode("-", $range);
			if(empty($begin)){
				$begin = 0;
			}
			if(empty($end) || $end == 0){
				$end = $fileSize - 1;
			}
        }else{
            $begin = 0;
            $end = $fileSize - 1;
        }
        header("Content-Length: " . ($end - $begin + 1));
        //header("Content-Disposition: filename=".basename($filePath));
        //header("Content-Disposition: filename=".time().'.mp3');
        header("Content-Range: bytes " . $begin . "-" . $end . "/" . $fileSize);
		//header("Content-Range:bytes {$begin}-{$end}/{$fileSize}");
		header("Vary:Accept-Encoding");
		header("Cache-Control:max-age=315360000");
        $fobj = fopen($filePath, 'rb');
        ob_clean();
        flush();
        fseek($fobj, $begin);
        //设置分流
        $buffer = 1024 * 10;
        //来个文件字节计数器
        $count = 0;
        while(!feof($fobj)){
            $p = min($buffer,$end - $begin + 1);
            $begin += $p;
            $data = fread($fobj,$buffer);
            //$count += $buffer;//本次请求流量统计
            echo $data;    //传数据给浏览器端
        }
        fclose($fobj);
        
        //更新请求次数与
        /*$this->dbConObj('tab_client_sections')->where('id',$clientSectionInfo['c_id'])->update([
            'request_count' => $clientSectionInfo['request_count']+1,
            'traffic_count' => $clientSectionInfo['traffic_count']+$count
        ]);*/
        exit();
        //return true;
    }


版权声明: 此文为本站源创文章[或由本站编辑从网络整理改编],
转载请备注出处:
[狂码一生] https://www.sindsun.com/articles/8/99
[若此文确切存在侵权,请联系本站管理员进行删除!]


--THE END--