2014-08-30 128 views
0

當用戶點擊一個按鈕時,我必須創建一個excel文件(並且這個工作非常完美),但同時用戶必須下載我以前創建的文件,但下載不會「T開始...下載Excel文件Zend框架

控制器:

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

同時是不可能,作爲該文件的內容是與內容處置報頭中的響應的主體內通過。

Yóu需要創建2個獨立的電話。

在客戶端收到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 

設置HTTP響應代碼控制器動作裏面那樣:

$this->getResponse()->setHttpResponseCode(405); 

併爲文件名使用自己的內容處置標題。

要發送的文件內容只是做:

readfile($absolute_path_to_file); 
exit(1);