【问题标题】:StreamedResponse in Symfony4Symfony4 中的 StreamedResponse
【发布时间】:2019-03-29 11:35:51
【问题描述】:

我想为使用 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();
   }

如何添加此功能来缓冲音频?

提前致谢

【问题讨论】:

  • 您能否发布您的控制器操作代码,以便我们更好地描述要更改的内容?
  • 我在我的控制器中添加了下一条评论。我只想将此gitlab.com/nitsuga1986/media-buffer 翻译到我的控制器并返回一个音频缓冲区
  • 请改为编辑问题。将编辑作为答案可能会使人们感到困惑,应该删除。
  • 奇怪的是您没有返回响应?这个动作还有效吗?您确定正在使用此操作吗?可以通过bin/console router:match /api/id_file=2 检查它是否使用您期望的路线?
  • 对不起...我忘了放响应...实际上,我用 $response->send(); 返回响应

标签: reactjs symfony buffering


【解决方案1】:

我终于得到了解决方案:

$response = new BinaryFileResponse($fullName);
                $response->headers->set('Content-Type', 'audio/mpeg');
                $response->setContentDisposition(
                    ResponseHeaderBag::DISPOSITION_INLINE,
                    $filename
                );
                return $response;

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 1970-01-01
    • 2019-04-15
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多