reactjs - Symfony4 中的 StreamedResponse
问题描述
我想为使用 React 和 Symfony4 制作的应用程序缓冲音频(mp3)。我遇到的问题是,当我在音频标签 HTML5 中注入 src 时,我必须等待下载完成才能播放音频。
我想,我必须发送一个 StreamedResponse,而不是一个响应。我想要类似http://opensource.box.com/spout/guides/symfony-stream-content-large-spreadsheet/但在我的情况下,总是下载完整的文件,它没有缓冲。
我做了这个代码https://gitlab.com/nitsuga1986/media-buffer。你可以在这里查看: https ://www.opoque.com/prueba/sample.html
它运行良好,但是,如果你检查代码,标签在 src 中有一个 index.php,但是因为我使用的是 Symfony 4,所以我不能这样做,我只能在 src 中添加如下内容:
<audio src="www.example.com/api/id_file=2" />
我创建了一个获取文件 id 的新路径,并在其中创建了一个 StreamedResponse,但正如我之前所说,文件已完全下载。
这是我的控制器方法:
/**
* @Rest\Get("/v1/audio/{id}.{_format}", name="audio_download",
*
* @SWG\Tag(name="Files")
*/
public function downloadAudioAction(Request $request, $id) {
$serializer = $this->get('jms_serializer');
$em = $this->getDoctrine()->getManager();
$theme = [];
$message = "";
$response = new StreamedResponse();
$response->setCallback(function () {
$handle = fopen($id, 'r');
while (!feof($handle)) {
$buffer = fread($handle, 1024);
echo $buffer;ob_flush();
flush();
}
fclose($handle);
});
$response->send();
}
如何添加此功能来缓冲音频?
提前致谢
解决方案
我终于得到了解决方案:
$response = new BinaryFileResponse($fullName);
$response->headers->set('Content-Type', 'audio/mpeg');
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_INLINE,
$filename
);
return $response;
推荐阅读
- php - 从 php 中的 mysqli_query() 执行时,sql OFFSET 和 LIMIT 查询不起作用
- firebase - Flutter + Firestore:如何从 Firestore 查询中获取子集合的流
- reactjs - 如何从 Firebase 存储中获取 URL?
- python - 用于 influxdb 的 python 包的 DataFrameClinet 类仅上传数据框中的最后一行
- java - java tika如何将html转换为保留特定元素的纯文本
- python-3.x - Django - 无法通过完整日历删除数据库中的对象
- angular - 使用动态变量发布请求
- python - 从 google.cloud 导入数据存储给出“ImportError:无法导入名称“collections_abc”
- javascript - 如何在 Node js 中使用 Stream 同步读取文件?
- google-apps-script - 我的 onOpen 触发器只运行了一半的脚本