首先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吧,以后有时间再看,抱歉!!!
以上只作本人的学习记录