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头究竟是在哪里输出的;
二、两台服务器配置同样,为何一样的代码,一台就会有问题,另外一台就没问题;调试

相关文章
相关标签/搜索