2011-03-07 59 views
6

我在symfony中构建了一个简单的动作,它通过wkhtmltopdf生成一个PDF文件并将其输出到浏览器。symfony:setHttpHeader()不起作用,header()做

下面的代码:

$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()函数在我的行动手动设置,萤火显示标题为预期。 有人知道什么可能是错的?它是一个symfony错误,或者一个php或apache2配置问题?我不明白。 : -/

在此先感谢!

+0

@teonanacatl ...选择你的一个帐户并使用它当前正在使用清楚两个不同的帐户的http:。/ /stackoverflow.com/users/647993/teonanacatl和http://stackoverflow.com/users/480353/teonanacatl –

回答

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

HEADER_ONLY,而不是HEADERS_ONLY –

+0

如果不添加$ this-> getResponse() - > sendHttpHeaders ); – Jestep

0

,我有唯一的区别是:

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

得到了同样的问题。只需添加双引号(“)将文件名

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

header('Content-Disposition: attachment; filename="'.$filename.'"'); 
相关问题