2011-03-07 10 views
6

Construí una acción simple en Symfony que genera un archivo PDF a través de wkhtmltopdf y lo envía al navegador.symfony: setHttpHeader() no funciona, header() hace

Aquí está el código:

$response = $this->getResponse(); 
    $response->setContentType('application/pdf'); 
    $response->setHttpHeader('Content-Disposition', "attachment; filename=filename.pdf"); 
    $response->setHttpHeader('Content-Length', filesize($file)); 
    $response->sendHttpHeaders(); 
    $response->setContent(file_get_contents($file)); 
    return sfView::NONE; 

que funciona bien en mi entorno de desarrollo local - mi navegador obtiene las cabeceras como se esperaba, mostrando la descarga en el diálogo.

Ahora actualicé mi entorno de prueba, ejecutando Apache 2.2.9-10 + lenny9 con PHP 5.3.5-0.dotdeb.0. Si llamo a esa URL ahora para la prueba con el medio, mi navegador no reciben ninguna cabecera conjunto personalizado:

Date Mon, 07 Mar 2011 10:34:37 GMT 
Server Apache 
Keep-Alive timeout=15, max=100 
Connection Keep-Alive 
Transfer-Encoding chunked 

Si les puse manualmente a través de cabecera() en mi acción, Firebug muestra las cabeceras como se esperaba . ¿Alguien sabe qué podría estar mal? ¿Es un error de Symfony o un problema de configuración de php o apache2? No lo entiendo : -/

¡Gracias de antemano!

+0

@teonanacatl ... Elige una de sus cuentas y utilizarlo Actualmente está utilizando claramente dos cuentas diferentes http:..//stackoverflow.com/users/647993/teonanacatl y http://stackoverflow.com/users/480353/teonanacatl –

Respuesta

10

Su problema está aquí:

return sfView::NONE; 

Cambiar esto a:

return sfView::HEADERS_ONLY; 

edición actualización debido a los comentarios adicionales .

Como intenta descargar un pdf, se acerca al problema incorrectamente. No use sendContent(). Ver más abajo (esto es un fragmento de una planta de producción que he escrito y ha demostrado que funciona en todos los navegadores más importantes):

$file = '/path/to/file.pdf'; 
$this->getResponse()->clearHttpHeaders(); 
$this->getResponse()->setStatusCode(200); 
$this->getResponse()->setContentType('application/pdf'); 
$this->getResponse()->setHttpHeader('Pragma', 'public'); //optional cache header 
$this->getResponse()->setHttpHeader('Expires', 0); //optional cache header 
$this->getResponse()->setHttpHeader('Content-Disposition', "attachment; filename=myfile.pdf"); 
$this->getResponse()->setHttpHeader('Content-Transfer-Encoding', 'binary'); 
$this->getResponse()->setHttpHeader('Content-Length', filesize($file)); 

return $this->renderText(file_get_contents($file)); 
+1

HEADER_ONLY, no HEADERS_ONLY –

+0

Esto no funcionaría para mí sin agregar $ this-> getResponse() -> sendHttpHeaders (); – Jestep

0

La única diferencia que tengo es:

$response = $this->getContext()->getResponse(); 
$response->clearHttpHeaders(); 
0

dieron el mismo problema. Sólo tiene que añadir comillas (") alrededor del nombre de fichero

$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename="'.$filename.'"'); 

o

header('Content-Disposition: attachment; filename="'.$filename.'"');