Serve mp3 stream for android with Laravel Serve mp3 stream for android with Laravel laravel laravel

Serve mp3 stream for android with Laravel


The problem: Response::download(...) doesn't produce a stream, so I can't serve my .mp3 file.

The solution:As Symfony HttpFoundation doc. says in the serving file paragraph:

"if you are serving a static file, you can use a BinaryFileResponse"

The .mp3 files I need to serve are statics in the server and stored in "/storage/songs/" so I decided to use the BinaryFileResponse, and the method for serving .mp3 became:

use Symfony\Component\HttpFoundation\BinaryFileResponse;[...]public function getSong(Song $song) {    $path = storage_path().DIRECTORY_SEPARATOR."songs".DIRECTORY_SEPARATOR.$song->path.".mp3");    $user = \Auth::user();    if($user->activated_at) {        $response = new BinaryFileResponse($path);        BinaryFileResponse::trustXSendfileTypeHeader();        return $response;    }    \App::abort(400);}

The BinaryFileResponse automatically handle the requests and allow you to serve the file entirely (by making just one request with Http 200 code) or splitted for slower connection (more requests with Http 206 code and one final request with 200 code).
If you have the mod_xsendfile you can use (to make streaming faster) by adding:

BinaryFileResponse::trustXSendfileTypeHeader();

The android code doesn't need to change in order to stream the file.