Symfony2 - Force file download

Xavi picture Xavi · Oct 22, 2012 · Viewed 72.5k times · Source

I'm trying to download a file when a user clicks on download link.

In Controller:

    $response = new Response();
    $response->headers->set('Content-type', 'application/octect-stream');
    $response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
    $response->headers->set('Content-Length', filesize($filename));

    return $response;

This is opening the dialog box to save the file, but it says the file is 0 bytes. And changing it to:

        $response = new Response();
        $response->headers->set('Content-type', 'application/octect-stream');
        $response->headers->set('Content-Disposition', sprintf('attachment; filename="%s"', $filename));
        $response->headers->set('Content-Length', filesize($filename));
        $response->headers->set('Content-Transfer-Encoding', 'binary');
        $response->setContent(readfile($filename));

        return $response;

I get a bunch of weird characters instead of the file download dialog box.

Finally, switching the "setContent" line to:

    $response->setContent(file_get_contents($filename));

It returns a PHP error:

Fatal error: Allowed memory size...

Any clues on how to achieve this? I've done it before in PHP (wihtout MVC), but I don't know what can be missing to do it through Symfony2...

Maybe the solution is setting the memory_limit in PHP.INI, but I guess it´s not the best practice...

Answer

denkweite picture denkweite · Dec 3, 2015

The most comfortable solution is

use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;

$response = new BinaryFileResponse($file);
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT);

return $response;