我正在尝试使用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'......我假设这是可能的,因为我在浏览器中没有正确描述格式时得到了理想的行为......感谢任何帮助。
答案 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
来自用户,您需要对其进行验证(如果您不是,那么用户可以滥用它)关于你的其他尝试:
makeDisposition()
的第二个参数应该是ASCII文件名,而不是URL RedirectResponse
设置此类标头没有意义 - 它只是重定向浏览器,因此 Content-Disposition 不会应用于目标网址