Symfony2 - Force file download

download, header, php, symfony

Solution

I finally solved this without X-SendFile (which is probably the best practice). Anyway, for those who can't get X-Sendfile apache module to work (shared hosting), here's a solution:

// Generate response
$response = new Response();

// Set headers
$response->headers->set('Cache-Control', 'private');
$response->headers->set('Content-type', mime_content_type($filename));
$response->headers->set('Content-Disposition', 'attachment; filename="' . basename($filename) . '";');
$response->headers->set('Content-length', filesize($filename));

// Send headers before outputting anything
$response->sendHeaders();

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

return $response;

Problem

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...

Original source

Related problems