Zend Framework中header下載檔案的問題及解決

c-xuan發表於2014-03-04

問題描述:

在使用Zend Framework框架開發過程中需要使用者下載excel檔案的功能。之前看過PHP的header()函式可以下載檔案,於是便查了一下header函式,W3School中給出的用法是:

header(string,replace,http_response_code)
引數 描述
string 必需。規定要傳送的報頭字串。
replace

可選。指示該報頭是否替換之前的報頭,或新增第二個報頭。

預設是 true(替換)。false(允許相同型別的多個報頭)。

http_response_code 可選。把 HTTP 響應程式碼強制為指定的值。(PHP 4 以及更高版本可用)

以下為下載pdf的例子:

<?php
header("Content-type:application/pdf");//不同型別的檔案程式碼不同
// 檔案將被稱為 downloaded.pdf
header("Content-Disposition:attachment;filename=".$name);//這是下載時顯示的名字,不含路徑
// PDF 源在 original.pdf 中
readfile($fileName);//$fileName可以是路徑
?>

在網上找了個下載Execel的程式碼:

出處:http://www.oschina.net/code/snippet_98890_27376

01 if (file_exists(CACHE_PATH . $file_name)){
02             //$this->logger->error('file realpath:'.realpath(CACHE_PATH . $file_name));
03             header( 'Pragma: public' );
04             header( 'Expires: 0' );
05             header( 'Content-Encoding: none' );
06             header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
07             header( 'Cache-Control: public' );
08             header( 'Content-Type: application/vnd.ms-excel'); 
09             header( 'Content-Description: File Transfer' );
10             header( 'Content-Disposition: attachment; filename=' $file_name );
11             header( 'Content-Transfer-Encoding: binary' );
12             header( 'Content-Length: ' filesize ( CACHE_PATH . $file_name ) );
13             readfile ( CACHE_PATH . $file_name );
14         else {
15             $this->logger->error('export model :'.$id.' 錯誤:未生產檔案');
16             echo '<script>alert(\'export error, file not exists!\')</script>';
17         }

我將程式碼應用到Zend Framework中的一個action中,此action是有對應前端phtml頁面的,當使用者發出下載檔案的請求時,檔案可以下載,顯示檔案大小都正常,可是開啟excel檔案報錯,提示檔案型別與副檔名不一致。



從顯示的問題可以推斷,檔案並非我們想要的excel格式檔案,似乎是一個網頁,找不到css檔案。是下載檔案的程式碼有問題麼?


解決方法:

我將下載檔案的程式碼單獨拿出來試驗,放在Apache伺服器的根目錄下,在瀏覽器中開啟試驗檔案,發現下載正常,檔案也可以開啟。

倒騰了一些時間發現僅僅是因為一個函式在作怪,exit(); !!!!!

在下載檔案的程式碼中readfile ()後就截止了,而我在框架中的action方法裡readfile()函式後面沒有加入exit()函式,使得錯誤的發生。



相關文章