2011-03-07 17 views
6

Zbudowałem prostą akcję w symfony, która generuje plik PDF przez wkhtmltopdf i wysyła go do przeglądarki.symfony: setHttpHeader() nie działa, header() ma

Oto kod:

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

To działa dobrze w moim lokalnym środowisku programistycznym - moja przeglądarka pobiera nagłówki jak oczekiwano, pokazując download-dialog.

Teraz zaktualizowałem środowisko testowe, uruchamiając Apache 2.2.9-10 + lenny9 z PHP 5.3.5-0.dotdeb.0. jeśli zadzwonię że teraz URL do testowania-środowiskowych, moja przeglądarka nie dostać żadnych niestandardowy zestaw nagłówków:

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

Jeżeli ustawić je ręcznie za pomocą nagłówka() w moim działaniu, Firebug pokazuje nagłówki jak oczekiwano . Czy ktoś wie, co może być nie tak? Czy jest to błąd symfony, czy problem z konfiguracją php lub apache2? Nie rozumiem tego. : -/

Z góry dziękuję!

+0

@teonanacatl ... Wybierz jedną z kont i używać go Obecnie nie są wyraźnie za pomocą dwóch różnych kont http:. /. /stackoverflow.com/users/647993/teonanacatl i http://stackoverflow.com/users/480353/teonanacatl –

Odpowiedz

10

Twój problem jest tutaj:

return sfView::NONE; 

Zmień to:

return sfView::HEADERS_ONLY; 

edycji aktualizacji z powodu dodatkowych uwag .

Ponieważ próbujesz pobrać plik pdf, podejmiesz problem nieprawidłowo. Nie używaj sendContent(). Zobacz poniżej (jest to fragment z witryny produkcyjnej, którą napisałem i która sprawdzała się we wszystkich głównych przeglądarkach):

$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, nie HEADERS_ONLY –

+0

Nie zadziałałoby to dla mnie bez dodania $ this-> getResponse() -> sendHttpHeaders (); – Jestep

0

Jedyną różnicą, że mam to:

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

Mam ten sam problem. Wystarczy dodać cudzysłów (") wokół nazwy pliku

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

lub

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