首先xls是网上一个系统下载的数据文件,直接上传处理后出现红点问题。那么就想保存成xlsx试试,结果不让上传了。

ceckobecko/spreadsheet-reader 只允许上传xls文件,当上传xlsx文件时无法正确读取文件,并报 file not readable错误。

我们首先来解决不能上传xlsx文件的问题:

检查代码114行左右返回了error = 1 导致后面的代码报出上述错误,实际上并非文件没有读取权限:

if (substr($this->data, 0, 8) != IDENTIFIER_OLE) {
            $this->error = 1;
            return false;
           }

这里data:

$this->data = @file_get_contents($sFileName);

IDENTIFIER_OLE:

define('IDENTIFIER_OLE', pack("CCCCCCCC",0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1));

那么我们把0-8个字符转成16进制看看是什么内容吧:

        for ($a = substr($this->data, 0, 8), $i=0; $i<8; $i++) {
            $hex = dechex(ord($a[$i]));
            var_dump($hex);
        }

输出:

string(2) "50"
string(2) "4b"
string(1) "3"
string(1) "4"
string(2) "14"
string(1) "0"
string(1) "6"
string(1) "0"

我们把这些16进制再打包成二进制,再与原来的字符串判断是否相等:

define('TTTTTTTTTTTTTTTT', pack('CCCCCCCC', 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00));
var_dump(substr($this->data, 0, 8) == TTTTTTTTTTTTTTTT);

这里就会输出 bool(true) 了

那么我们在判断文件类型的时候还应该多加一个判断就可以上传xlsx文件了,如下:

define('TTTTTTTTTTTTTTTT', pack('CCCCCCCC', 0x50, 0x4b, 0x03, 0x04, 0x14, 0x00, 0x06, 0x00));
if (substr($this->data, 0, 8) != IDENTIFIER_OLE && substr($this->data, 0, 8) != TTTTTTTTTTTTTTTT) {
            $this->error = 1;
            return false;
           }

然后再试试上传,现在报500服务器内部错误了,而且处理时间明显加长了

后来发现用excel打开文件,直接按下ctrl+s保存一下,再上传就没有红点问题了,哎

算了还是保存为xls吧,以后有时间再看,抱歉!!!

以上只作本人的学习记录

标签: none

添加新评论