StreamedResponse в Symfony4 - PullRequest
       17

StreamedResponse в Symfony4

1 голос
/ 29 марта 2019

Я хочу буферизовать аудио (mp3) для приложения, созданного с помощью React и Symfony4.Проблема, с которой я столкнулся, заключается в том, что, когда я вставляю src в тэг Audio HTML5, мне нужно подождать окончания загрузки, прежде чем воспроизводить аудио.

Полагаю, мне нужно отправить ответ 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

И это работает хорошо, но, если вы проверите код, у тега есть index.php в src, но, поскольку я использую Symfony 4, я не могу этого сделать, я могу только добавитьв src что-то вроде:

<audio src="www.example.com/api/id_file=2" />

Я создал новый маршрут для получения идентификатора файла, и внутри него я создаю 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 Ответ

1 голос
/ 30 марта 2019

Я наконец-то получил решение:

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