如何将浏览器的流氓响应流式传输到浏览器?
问题描述:
我通过第三方API加载视频。
它返回正文中的二进制数,并带有Transfer-Encoding :chunked
标题。如何将浏览器的流氓响应流式传输到浏览器?
我使用Guzzle 4
来消费api,我怎样才能轻松地将它传输到浏览器,所以我不需要首先将整个东西加载到内存中?
我不想将它设置为attachment
,因为我希望它在浏览器中播放而不是下载。
<?php
$client = new GuzzleHttp\Client();
// Download the video and stream it to the client
$response = $client->get($url)->send();
//But this will have to cache the whole thing in PHP memory first...
header("Content-Type:{$response->getHeader('Content-Type')}");
echo $response->getBody();
答
我假设你想在视频播放器上在你的网站上显示视频。如果是这种情况,请转至http://docs.videojs.com/docs/guides/setup.html。但是,由此,用户在观看视频之前还必须先下载整个视频。如果你想要的是一个可以像YouTube一样通过块传输块的视频,它比这更复杂,我不相信你可以在PHP中做到这一点。您可以学习Node.js,Ruby或Python,或者只是使用视频即服务网站来为您做像vimeo或http://vzaar.com。
答
如果别人在看这...
狂饮4响应不是默认流(他们是在最新的版本),你必须启用在请求选项..
['stream'=>true]
然后使用Stream
UTIL读取数据流的每一行..
GuzzleHttp\Stream\Utils::readline
所以....
<?php
$client = new GuzzleHttp\Client();
// Download the video as a stream
$response = $client->request('GET', $url, ['stream'=>true])->send();
//$body is now a Guzzle stream object.
$body = $response->getBody();
header("Content-Type:{$response->getHeader('Content-Type')}");
while (!$body->eof()) {
echo GuzzleHttp\Stream\Utils::readline($body);
ob_flush();
flush();
}
除了Guzzle,你知道还有什么是HTTP客户端吗?用户的浏览器。为什么不让它直接消费视频? – Chris
由于内容位于我们的应用程序(而非用户)身份验证的私有API的后面。我基本上需要通过浏览器代理视频请求,通过我们的应用程序执行auth和其他一些事情,然后将视频返回给消费客户端。如果第三方API提供了像S3这样的预先认证的URL,那么我可以将任何请求重定向到该网址,但我拥有的就是这个流,而我无法看到一种简单的代理方式... –