php symfony header download

php - Symfony2-Descarga del archivo Force



header download (7)

+1 a la respuesta alexander.

Pero si no puede usar X-Sendfile, debe usar BinaryFileResponse agregado en el 2.2: symfony.com/doc/current/components/http_foundation/…

En mi proyecto el resultado es

$response = new /Symfony/Component/HttpFoundation/BinaryFileResponse($dir .DIRECTORY_SEPARATOR. $zipName); $d = $response->headers->makeDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT, $zipName ); $response->headers->set(''Content-Disposition'', $d); return $response;

Intento descargar un archivo cuando un usuario hace clic en el enlace de descarga.

En el controlador:

$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;

Esto abre el cuadro de diálogo para guardar el archivo, pero dice que el archivo tiene 0 bytes. Y cambiándolo a:

$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;

Obtengo un montón de personajes extraños en lugar del cuadro de diálogo de descarga de archivos.

Finalmente, cambiando la línea "setContent" a:

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

Devuelve un error de PHP:

Error fatal: tamaño de memoria permitido ...

¿Alguna pista sobre cómo lograr esto? Lo he hecho antes en PHP (sin MVC), pero no sé qué puede faltar para hacerlo a través de Symfony2 ...

Tal vez la solución es configurar el memory_limit en PHP.INI, pero supongo que no es la mejor práctica ...


A partir de Symfony 3.2, puede usar el asistente de controlador file () que es un atajo para crear una BinaryFileResponse como se mencionó en una respuesta anterior:

public function fileAction() { // send the file contents and force the browser to download it return $this->file(''/path/to/some_file.pdf''); }


En primer lugar, gracias a todos por sus respuestas. Finalmente resolví esto sin X-SendFile (que es probablemente la mejor práctica). De todos modos, para aquellos que no pueden hacer que X-Sendfile apache module funcione (alojamiento compartido), aquí hay una solución:

// 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;

¡Espero que esto ayude!


La solución más cómoda es

use Symfony/Component/HttpFoundation/BinaryFileResponse; use Symfony/Component/HttpFoundation/ResponseHeaderBag; $response = new BinaryFileResponse($file); $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); return $response;


No debe usar PHP para descargar archivos porque es una tarea para un servidor Apache o Nginx. La mejor opción es usar encabezados X-Accel-Redirect (en caso de Nginx) / X-Sendfile (en el caso de Apache) para la descarga de archivos.

El siguiente fragmento de acción se puede usar con Nginx configurado para descargar archivos desde Symfony2:

return new Response('''', 200, array(''X-Accel-Redirect'' => $filename));

UPD1: Código para apache con mod_xsendfile configurado:

return new Response('''', 200, array( ''X-Sendfile'' => $filename, ''Content-type'' => ''application/octet-stream'', ''Content-Disposition'' => sprintf(''attachment; filename="%s"'', $filename)) ));


No sé si puede ser útil, pero es application/octet-stream not application/octect-stream


Para aquellos que no tienen la opción de establecer encabezados:

El atributo de download puede ayudar según los navegadores a los que necesite soporte:

<a href="{file url}" download>

o

<a href="{file url}" download="{a different file name}">

Esto no es compatible con todos los navegadores heredados. Consulte esta página para obtener ayuda con el navegador:

https://www.w3schools.com/tags/att_a_download.asp