这段时间在做学校的微信公众平台,用的是CI框架,在上传文件的时候出现了一点问题。
需要上传的文件是一些音频,然后看了下CI的mimes.php,里面有的音频格式很少,比如需要上传的wma就没有。于是乎,我手动在mimes.php中添加:
'wma' => 'audio/x-ms-wma',
其中的mime是根据$_FILES输出得到的,但是在网上下了个wma的铃声来上传还是告诉我类型不允许。
试了好半天都不行,网上也搜不到任何有用的信息,无奈之下,去查看CI的do_upload()的源代码,输出调试,发现,CI在做类型验证的时候,通过了下面的代码获取了mime类型:
/* Fileinfo extension - most reliable method * * Unfortunately, prior to PHP 5.3 - it's only available as a PECL extension and the * more convenient FILEINFO_MIME_TYPE flag doesn't exist. */ if (function_exists('finfo_file')) { $finfo = finfo_open(FILEINFO_MIME); if (is_resource($finfo)) // It is possible that a FALSE value is returned, if there is no magic MIME database file found on the system { $mime = @finfo_file($finfo, $file['tmp_name']); finfo_close($finfo); /* According to the comments section of the PHP manual page, * it is possible that this function returns an empty string * for some files (e.g. if they don't exist in the magic MIME database) */ if (is_string($mime) && preg_match($regexp, $mime, $matches)) { $this->file_type = $matches[1]; return; } } }
然而,通过上面的代码获取到的mime类型不是audio/x-ms-wma,而是video/x-ms-asf,然后上网查了下,在这里似乎看到一点相关的东西,asf、wma、wmv文件格式一样,具体也不了解,也不知道这里类型判断错误是文件本身的原因还是本来就是区别不出来……
反正,既然找到了原因,将mimes.php中添加的内容改为:
'wma' => array('audio/x-ms-wma', 'video/x-ms-wmv', 'video/x-ms-asf'),
虽然说问题算是解决了,但还是得说,给CI这mime类型跪了,敢不敢不要让人感觉这么碎蛋!