symfony从网址下载视频

时间:2016-07-01 20:32:15

标签: php symfony response httpresponse

我正在尝试使用symfony从extrernal网址下载视频。所以我有这条路线,如果我直接在浏览器中点击它,我会收到两个可能的答案:播放视频或(如果浏览器无法重现),视频将从此外部URL下载。我想要创建的是Controller的响应,以便始终下载视频。我试过几个没有运气的解决方案。

一些尝试过的解决方案:

$response = new BinaryFileResponse($url);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);

return $response;

因为它不是静态文件失败。

也试过

$response = new RedirectResponse($url);
$response->headers->set('Content-Type', 'video');
$d = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$videoUrl
);
$response->headers->set('Content-Disposition', $d);

当然'StreamedResponse'......我假设这是可能的,因为我在浏览器中没有正确描述格式时得到了理想的行为......感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

我认为BinaryFileResponse不适用于网址。你应该得到一个关于文件不可读的例外。

看看StreamedResponse。您可以使用自定义回调将任何数据流式传输到浏览器:

use Symfony\Component\HttpFoundation\StreamedResponse;

// ...

$response = new StreamedResponse();

// attempt to generate a filename from the URL's path
$filename = @preg_replace('~[^\w\-.]+~', '', iconv('UTF-8', 'ASCII//TRANSLIT', pathinfo(urldecode(parse_url($url, PHP_URL_PATH)), PATHINFO_BASENAME))) ?: 'video';

// set headers to force file download
$response->headers->set('Content-Type', 'application/force-download');
$response->headers->set(
    'Content-Disposition',
    $response->headers->makeDisposition(
        ResponseHeaderBag::DISPOSITION_ATTACHMENT,
        $filename
    )
);

// stream content from the URL to the browser
$response->setCallback(function () use ($url) {
    $c = curl_init($url);
    curl_exec($c);
    curl_close($c);
});
  • 如果$url来自用户,您需要对其进行验证(如果您不是,那么用户可以滥用它)
  • 远程文件将通过您的应用下载并流式传输,因此您可能会遇到大文件/慢连接/超时问题
  • 没有办法强制下载远程资源而不自行流式传输(除非远程服务器明确支持它),因此cURL解决方案

关于你的其他尝试:

  1. 视频不是有效的内容类型
  2. makeDisposition()的第二个参数应该是ASCII文件名,而不是URL
  3. RedirectResponse设置此类标头没有意义 - 它只是重定向浏览器,因此 Content-Disposition 不会应用于目标网址