手机访问          
logo
php 转发远程资源给客户端(断点续传)流转发
更新时间:2016-06-18 17:41:50    1201次阅读 评论 0

 

 

说一下背景:


如果想让自己的资源位置不被被别人知道,而又得把明面的资源发布出去,这就需要流转发


当然这样子会增加自己流转发服务器的负担--策略上,没事不要做这事情。


做这事情的时候(流转发),为了隐藏资源位置没有办法!!!



当你转发 的资源数据较大时,常规获取远程资源的方式已经不适用了,比如视频的播放--要求加载了就能开始播放,而不是得到视频加载完了才播放。


这时候我们就要考虑断点续传了 --  客户端获取资源需要断点续传  --  流转发资源服务器获取远程资源(你要隐藏位置

的资源)也需要断点续传


这时,我们发现两处需要断点续传,我们该怎么处理呢?


首先客户端要向流转发服务器拿资源,那么返回客户端的东西会是 请求头header 响应头header 做手脚了


                
		//$url = "http://www.zhoubo15.cn/video/demo.mp4"; //远程资源 
		$url = $_GET["url"];
		$headers = get_headers($url,true);// 获取远程资源的header信息 
		$file_size = $headers["Content-Length"];
		
		$size2 = (int)$file_size-1;
		$range = 0;
		
		if(isset($_SERVER['HTTP_RANGE'])) {
		
			header('HTTP /1.1 206 Partial Content');
		
			$range = str_replace('=','-',$_SERVER['HTTP_RANGE']);
		
			$range = explode('-',$range);
		
			$range = trim($range[1]);  // 片段头
		
			header('Content-Length:'.$file_size);
		
			header('Content-Range: bytes '.$range.'-'.$size2.'/'.$file_size);// 片段范围
			
			$file_content = get($url,$range);
			
		} else {
		
			header('Content-Length:'.$file_size);
		
			header('Content-Range: bytes 0-'.$size2.'/'.$file_size);
			
			$file_content = get($url);
		}
		
		$app_type = "video/mp4";
		$file_name = "demo.mp4";
		header("Accept-Ranges:bytes");// 流--字节流 返回
		header("Cache-control: public");
		header("Pragma: public");
		header("Etag:".$headers["ETag"]);
		header("Last-Modified:".$headers["Last-Modified"]);
	
	
	        header("Content-type: $app_type");//输出的类型,根据下面提供的MIME表,选择相应的类型
	        header("Content-Disposition: attachment; filename='$file_name'");
	        echo $file_content; 
	       
	  
	  
	 // 断点续传获取远程资源   
        function get($url,$offset=0){ // 注意---这里只适合取简单http 协议的资源 
	
	    $curl = curl_init();
	    curl_setopt($curl, CURLOPT_URL, $url);
	    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);    // 不需要结果输出屏幕 文本流
	    curl_setopt($curl, CURLOPT_HEADER, 0); // 不要http header 加快效率
	    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
	    curl_setopt($curl, CURLOPT_RESUME_FROM, $offset);
	    $data = curl_exec($curl);
	    curl_close($curl);
	
	    return $data;
        }


代码核心写出来了,具体的调用就不再细讲了


核心总结:断点续传同步





分享按钮 分类:php
  

create:2016-06-17    阅读量(1201) 评论( 0 )

返回顶部
登录评论
  ABOUT ME
头像
昵称零零一
博龄 { 56.5月 }
积分610
博主被推荐的文章
相关博文
推荐博文
    php对象存数组, 数组存对象列表,而整
    读书无趣
    SQL Date 数据类型
    C# DataTbale详细操作
    SQL SERVER 添加参数传递值
    Mysql并发时经典常见的死锁原因
    H5 网页怎么适应pc 与手机的尺寸
    电商企业最基本的架构解说
    疾病及编码介绍十、耳和乳突疾病(H60~
    C#参数传递
标签云
反馈 联系©2015-2016 2016 ©zhoubo15.cn 粤ICP备15029033号-1