CodeIgniter 3.1.7无法上传msg文件,求排查原因
我之前在使用CI3上传特殊文件时也踩过类似的坑,结合你给出的配置和报错信息,大概率是这几个原因导致的,一个个排查试试:
实际检测的MIME类型不在配置列表里
CI3的上传类默认启用detect_mime(默认值为true),它会优先用finfo扩展检测文件的真实MIME类型,而非只依赖$_FILES返回的application/octet-stream。有可能你的.msg文件真实MIME是另一个值(比如application/x-msg),而这个值没加到mimes.php的msg对应数组里。
你可以临时加一段代码打印真实检测结果:$finfo = new Finfo(FILEINFO_MIME_TYPE); echo $finfo->file($_FILES['your_upload_field_name']['tmp_name']); exit;把输出的MIME类型添加到
mimes.php的'msg'数组里即可。修改的mimes.php文件不对或被缓存
确认你修改的是application/config/mimes.php(应用目录下的文件),而非系统目录system/application/config/mimes.php里的文件。另外如果服务器开启了OPcache,可能缓存了旧的配置内容,重启Web服务器或清除OPcache缓存再试试。文件扩展名大小写不匹配
如果用户上传的文件是.MSG大写扩展名,而你allowed_types里写的是小写msg,且$config['file_ext_tolower']是默认的false,CI会认为扩展名不匹配。你可以把allowed_types改成msg|MSG,或者设置$config['file_ext_tolower'] = true,让系统自动把扩展名转小写后再匹配。服务器环境限制导致MIME检测异常
有些服务器可能禁用了finfo扩展,或者会篡改上传文件的MIME类型。你可以先检查phpinfo()里是否有finfo扩展的信息,如果没有,CI会回退到使用$_FILES里的MIME值,这时候要确保这个值在你配置的msg对应MIME数组里。另外也可以临时关闭detect_mime(仅用于测试,生产环境别用,有安全风险)来验证:$config['detect_mime'] = false;如果关闭后能上传成功,就说明是MIME检测的问题,回到第一个点排查真实MIME值。
内容的提问来源于stack exchange,提问作者jtheman

