symfony: setHttpHeader () не работает, header () работает - PullRequest
6 голосов
/ 07 марта 2011

Я создал простое действие в symfony, которое генерирует PDF-файл через wkhtmltopdf и выводит его в браузер.

Вот код:

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

Это прекрасно работает в моей локальной среде разработки - мой браузер получает заголовки, как и ожидалось, показывая диалог загрузки.

Теперь я обновил свою среду тестирования, используя Apache 2.2.9-10 + lenny9 с PHP 5.3.5-0.dotdeb.0. Если я сейчас позвоню по этому URL для среды тестирования, мой браузер не получит никаких пользовательских заголовков:

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

Если я установлю их вручную через header () в своем действии, Firebug покажет заголовки, как и ожидалось. Кто-нибудь знает, что может быть не так? Это ошибка Symfony или проблема конфигурации php или apache2? Я не понимаю : - /

Заранее спасибо!

Ответы [ 3 ]

10 голосов
/ 07 марта 2011

Ваша проблема здесь:

return sfView::NONE;

Измените это на:

return sfView::HEADERS_ONLY;

изменить обновление из-за дополнительных комментариев.

Так как вы пытаетесь скачать pdf, вы неправильно подходите к проблеме. Не используйте sendContent(). См. Ниже (это фрагмент с рабочего сайта, который я написал и который работает во всех основных браузерах):

$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));
0 голосов
/ 10 сентября 2013

У меня такая же проблема. Просто добавьте двойные кавычки (") вокруг имени файла

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

или

header('Content-Disposition: attachment; filename="'.$filename.'"');
0 голосов
/ 07 марта 2011

Единственное отличие, которое у меня есть:

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