当用户单击一个按钮时,我必须创建一个excel文件(这很好用)但同时用户必须下载我之前创建的文件,但下载没有开始..
控制器:
public function downloadAction() {
// I create the excel file .......
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$this->getResponse()->setRawHeader( "Content-Type: application/vnd.ms-excel; charset=UTF-8" )
->setRawHeader( "Content-Disposition: attachment; filename=excel.xls" )
->setRawHeader( "Content-Transfer-Encoding: binary" )
->setRawHeader( "Expires: 0" )
->setRawHeader( "Cache-Control: must-revalidate, post-check=0, pre-check=0" )
->setRawHeader( "Pragma: public" )
->setRawHeader( "Content-Length: " . filesize( $filename ) )
->sendResponse();
echo json_encode(array(
'success' => 'true',
'xls' => 'http://'.$_SERVER['SERVER_NAME'].'/export/excel.xls'
));
exit();
}
答案 0 :(得分:0)
同一时间不可能,因为文件的内容是通过 Content-Disposition 标头在响应正文中传递的。
Yóu需要创建两个分开的电话。
客户端收到JSON响应后,客户端需要调用另一个uri,也就是刚刚发送的uri来获取文件的内容。
在网站上,您需要在页面中添加一个iframe,其中包含src =“http://'.$_SERVER ['SERVER_NAME']。'/ export / excel.xls”。
<iframe src="http://'.$_SERVER['SERVER_NAME'].'/export/excel.xls"></iframe>
这将在当前页面内开始下载,否则页面将被更改,将显示一个空窗口。
也许使用Javascript为iframe生成html或只添加一个id =“downloadContainer”的隐藏iframe,只需更改此iframe的src。
另一个想法是,将JSON数据作为标题与文件一起发送为正文。
X-status: success
X-filename: //server.com/export/test.xls
但两个参数都不需要,因为你可以使用默认的传输特定参数。
为什么不使用HTTP StatusCode获取成功/错误状态。
200 -Ok
201 -Created
400 -Bad request
404 -Not found
405 -Not allowed
500 -Server error
在Controller Action中设置HTTP响应代码,如下所示:
$this->getResponse()->setHttpResponseCode(405);
对于文件名,请使用您的内容处置标题。
要发送文件内容,请执行以下操作:
readfile($absolute_path_to_file);
exit(1);