当然,其他一些人已经在 stackoverflow 上讨论了这些问题,但并非所有分析器都适合我,而且他们通常不提供 symfony 安装的版本。
我阅读的主题:
这就是我要问你如何在 symfony 1.4 中处理文件下载的问题(不使用视图)?在我所有的用例中,我都需要一个模板文件来呈现响应。如果我发送由于控制器的响应,则唯一可能发送它而不会出现 php 错误(标头已发送)
控制器:
/** @var $response sfWebResponse */
$response = $this->getResponse();
$response->clearHttpHeaders();
$response->setContentType($mimeType);
$response->setHttpHeader('Content-Disposition', 'attachment; filename="' . basename($filePath) . '"');
$response->setHttpHeader('Content-Description', 'File Transfer');
$response->setHttpHeader('Content-Transfer-Encoding', 'binary');
$response->setHttpHeader('Content-Length', filesize($filePath));
$response->setHttpHeader('Cache-Control', 'public, must-revalidate');
$response->setHttpHeader('Pragma', 'public');
$response->sendHttpHeaders();
readfile($filePath); die();
这在没有模板文件的情况下工作。但是恕我直言,这不是那么漂亮的编码。
模板的替代方法:
控制器:
/** @var $response sfWebResponse */
$response = $this->getResponse();
$response->clearHttpHeaders();
$response->setContentType($mimeType);
$response->setHttpHeader('Content-Disposition', 'attachment; filename="' . basename($filePath) . '"');
$response->setHttpHeader('Content-Description', 'File Transfer');
$response->setHttpHeader('Content-Transfer-Encoding', 'binary');
$response->setHttpHeader('Content-Length', filesize($filePath));
$response->setHttpHeader('Cache-Control', 'public, must-revalidate');
$response->setHttpHeader('Pragma', 'public');
$response->setContent(file_get_contents($filePath));
$response->sendHttpHeaders();
return sfView::NONE;
看法:
<?php echo $sf_response->getRawValue()->getContent(); ?>