symfony 从 url 下载视频

symfony downloading video from url

我正在尝试使用 symfony 从外部 URL 下载视频。所以我有这条路线,如果我直接在浏览器中点击它,我会收到两个可能的答案:播放视频或(如果浏览器无法重现),从这个外部下载视频 URL .我要创建的是控制器始终下载视频的响应。我尝试了几种解决方案都没有成功。

一些尝试过的解决方案:

$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”……我假设这是可能的,因为当格式未在浏览器中正确转换时我得到了所需的行为……感谢任何帮助。

我认为 BinaryFileResponse 不适用于 URL。您应该得到关于文件不可读的异常。


看看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 来自您需要验证它的用户(如果您不这样做,那么用户可能会滥用它)
  • 远程文件将通过您的应用下载和流式传输,因此您可能 运行 遇到大 files/slow connections/timeouts
  • 的问题
  • 没有办法强制下载远程资源而不自己流式传输(除非远程服务器明确支持它),因此 cURL 解决方案

关于您的其他尝试:

  1. 视频 不是有效的 Content-Type
  2. makeDisposition() 的第二个参数应该是 ASCII 文件名,而不是 URL
  3. RedirectResponse 设置这样的 headers 没有意义 - 它只是重定向浏览器,因此 Content-Disposition 不会适用于目的地 URL