下载Excel文件Zend框架

时间:2014-08-30 09:47:16

标签: excel zend-framework

当用户单击一个按钮时,我必须创建一个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();
}

1 个答案:

答案 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);