我在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配置问题?我不明白。 : - /
提前致谢!
答案 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.'"');