symfony:setHttpHeader()不起作用,header()没有

时间:2011-03-07 10:43:10

标签: php symfony1 apache2 http-headers symfony-1.4

我在symfony中构建了一个简单的动作,它通过wkhtmltopdf生成一个PDF文件并将其输出到浏览器。

以下是代码:

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

在我的本地开发环境中工作正常 - 我的浏览器按预期获得标题,显示下载对话框。

现在我更新了我的测试环境,用PHP 5.3.5-0.dotdeb.0运行Apache 2.2.9-10 + lenny9。 如果我现在为测试环境调用该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 bug,还是php或apache2配置问题?我不明白。 : - /

提前致谢!

3 个答案:

答案 0 :(得分:10)

你的问题在这里:

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

答案 1 :(得分:0)

我唯一的区别是:

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

答案 2 :(得分:0)

遇到同样的问题。只需在文件名

周围添加双引号(“)
$this->getResponse()->setHttpHeader('Content-Disposition', 'attachment; filename="'.$filename.'"');

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