为什么不能使用zend框架动作触发浏览器下载对话框?


Why can't i trigger browser download dialog using zend framework action?

我构建了一个小脚本来触发下载对话框,如下所示:

<?php
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.'123.txt');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
ob_end_clean();
echo ' '; 
flush();
//do something long
//for example
sleep(5);
for($i = 0; $i<10; $i++){
echo $i . PHP_EOL;
sleep(1);             
}

如果我把它放在一个单独的文件中,例如,download.php,它可以正常运行;立即弹出下载对话框。

如果我把它放在一个Zend框架动作布局和视图渲染禁用,它的行为是不同的(下载对话框弹出后15秒左右)。

为什么会有这种差异?

Zend Framework处理动作的输出,并将添加额外的头,可能会覆盖头。

 // Disable default phtml rendering
 $this->_helper->viewRenderer->setNoRender(true);
 $response->clearAllHeaders();

对于ZF1,我们使用这一行来关闭视图的正常呈现,从而允许下载工作。