这是一篇早先学习CodeIgniter框架时的笔记,记录了对CI框架上传文件MIME类型判定时遇到的问题和解决方案,整理出来留作备忘和分享.

起因

在学习使用CI框架的时候,尝试集成了百度的文件上传插件webUploader进行图片和Office文档的批量上传(这里暂且不吐槽百度这插件那翔一般的文档),其他都挺顺利的,然而后端对Office上传文件进行判断时,在do_upload后总是失败.使用display_errors输出错误信息发现,是对文件的MIME类型判断失败,显示”cdf v2 document, corrupt: can’t expand summary_info”的错误信息.

分析

CI框架出于安全考虑,对上传文件的类型判断并不仅仅是判断文件后缀名这么简单,同时还会读取文件的MIME(Multipurpose Internet Mail Extensions)类型,判断是否和config目录下mimes.php中的类型匹配,但是不知道是什么情况导致了MIME类型读取失败.

通过查看框架代码发现,CI是使用@mime_content_type函数来判断的,但是不知为何该函数返回了FALSE或者空字符串导致此问题的出现.

回到对上传文件的分析,我发现并不是所有的Office文件都会导致此问题,仅限于那些打开时Office有提示是”来源于网络的文档”.而且,当对文档进行了编辑(取消保护模式)后保存,再上传却可以上传成功!

所以暂且推测是mime_content_type对保护模式的文档MIME类型判断存在问题导致的.

解决方法

在config/mimes.php的$mimes数组中,对需要允许上传的类型加入特殊处理.比如如果需要上传的是doc类型的文件,就改成:

1
'doc'	=>	array('application/vnd.openxmlformats-officedocument.wordprocessingml.document','application/msword',"cdf v2 document, corrupt: can't expand summary_info"),

参考链接:

Macで”cdf v2 document, corrupt: can’t expand summary_info”