Kartik Export —— 導出的Excel文件打開失敗

使用Kartik Export控件導出Excel格式的文件,可是導出的文件打開時彈出以下信息:
Kartik Export —— 導出的Excel文件打開失敗
錯誤信息是:Excel沒法打開文件「xxx.xlsx",由於文件格式或文件擴展名無效。請肯定文件未損壞,而且文件擴展名與文件的格式匹配。php

在網上找了一些資料,說是兩個可能:
一、 返回的HTTP頭要區分2003和2007的格式;
二、 返回的數據有utf-8的BOM頭;nginx

我一開始是對這兩個緣由持懷疑態度的,由於我有2個一樣的服務器,都是Centos 7 + nginx,對於同一個導出文件的連接,一個服務器是好的,另外一個就有問題,而這兩臺服務器上的代碼都是同樣的,因此,若是是上面的緣由的話,那應該是兩臺服務器都有問題纔對。瀏覽器

經過跟蹤代碼,發現Kartik Export控件是先把文件保存到本地,而後再用流的方式經過瀏覽器輸出,代碼以下:
Kartik Export —— 導出的Excel文件打開失敗
因而稍微修改了一下this->cleanup()裏的代碼,去掉了刪除文件的部分:
Kartik Export —— 導出的Excel文件打開失敗
執行完導出操做後,到服務器上的backend/runtime/export目錄下,找到生成的Excel文件,從服務器拉下來打開,發現沒問題,那就肯定控件導出的文件自己是沒問題的,那就看看經過瀏覽器下載到本地的文件:
Kartik Export —— 導出的Excel文件打開失敗
發現文件的前面竟然有3個字節的utf-8的BOM頭,這下能夠肯定,直接緣由就是由於BOM頭致使文件打開失敗。服務器

這個BOM頭究竟是在何時被輸出的呢,很遺憾,從save()到readfile()之間,寫了若干調試好代碼,查看緩衝區輸出,都沒有找到。ide

那問題怎麼解決呢,增長個清除緩衝區的代碼,問題解決:this

$writer->save($file);
if ($this->stream) {
    $this->clearOutputBuffers();
    $this->setHttpHeaders();
    $this->clearOutputBuffers();
    readfile($file);
    $this->cleanup($file, $config);
    exit();
} else {

注:嘗試過只保留上面第一個clearOutputBuffers(),發現不行,必須在setHttpHeaders()先後都加上才能夠。3d

這個問題雖然最後獲得瞭解決,其實仍是留有幾個尾巴,但願有知道的高手不吝指教:
一、沒有搞清楚那個utf-8的BOM頭究竟是在哪裏輸出的;
二、兩臺服務器配置同樣,爲何一樣的代碼,一臺就會有問題,另外一臺就沒問題;調試

相關文章
相關標籤/搜索