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: