Symfony4中的StreamedResponse

时间:2019-03-29 11:35:52

标签: reactjs symfony buffering

我想为使用React和Symfony4制作的app缓冲音频(mp3)。我的问题是,当我在音频标签HTML5中插入src时,必须等待下载完成才能播放音频。

我想,我必须发送StreamedResponse而不是Response。我想要类似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();
   }

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

预先感谢

1 个答案:

答案 0 :(得分:1)

我终于找到了解决方法:

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