gpt4 book ai didi

php - symfony 从 url 下载视频

转载 作者:行者123 更新时间:2023-12-02 17:26:36 25 4
gpt4 key购买 nike

我正在尝试使用 symfony 从外部 URL 下载视频。所以我有这条路线,如果我直接在浏览器中点击它,我会收到两个可能的答案:播放视频或(如果浏览器无法重现),从这个外部 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”……我假设这是可能的,因为当浏览器中的格式未正确转换时我得到了所需的行为……感谢任何帮助。

最佳答案

我认为 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 来自用户,您需要对其进行验证(否则用户可能会滥用它)
  • 远程文件将通过您的应用下载和流式传输,因此您可能会遇到大文件/慢速连接/超时问题
  • 如果不自己流式传输远程资源,就无法强制下载它(除非远程服务器明确支持它),因此采用了 cURL 解决方案

关于您的其他尝试:

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

关于php - symfony 从 url 下载视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38153508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com