get_mimes() 是静态查表函数,不检测文件内容;它依赖 application/config/mimes.php 映射表,缺失扩展名(如 .webp)则返回 null;ci3 需手动添加、注意小写键名,返回值为扩展名→mime 列表的关联数组,使用前须判空;ci4 已移除该函数,改用 mime::guesstypefromextension()。

get_mimes() 返回的是一个静态数组,不是实时读取文件或检测内容的函数——它只查表,不分析数据。
为什么 get_mimes() 找不到你想要的扩展名
CodeIgniter 的 get_mimes() 依赖内置的 application/config/mimes.php 文件,这个文件是手动维护的映射表。如果你用的扩展名(比如 .webp、.heic、.mdx)不在里面,函数就返回 NULL 或空数组。
- 检查
application/config/mimes.php是否存在且被正确加载(CI3 要求该文件必须返回数组) - CI4 已移除
get_mimes(),改用CodeIgniter\HTTP\MIME类,直接调用MIME::guessTypeFromExtension('jpg') - CI3 中新增类型必须手动追加到
mimes.php数组里,例如:'webp' => ['image/webp'] - 注意大小写:CI3 的键名是小写扩展名,
.PDF和.pdf都会转成小写再查,但数组里必须写'pdf'
get_mimes() 返回数组结构容易误用
它返回的是「扩展名 → MIME 类型列表」的关联数组,不是「扩展名 → 单个字符串」。同一个扩展可能对应多个 MIME 类型(比如 .txt 可能有 text/plain 和 text/x-python),别直接当字符串用。
- 错误写法:
$mime = get_mimes()['jpg'][0];—— 没做存在性判断,'jpg'键可能不存在,触发 PHP notice - 安全写法:
if (isset(get_mimes()['jpg'][0])) { $mime = get_mimes()['jpg'][0]; } - 更稳妥:先存结果,避免重复调用(
get_mimes()每次都 require 并返回新数组):$mimes = get_mimes(); $mime = $mimes['jpg'][0] ?? null;
和 finfo_file() 混用时的典型误区
有人想“保险起见”,先用 get_mimes() 查扩展名,再用 finfo_file() 校验内容——这没问题;但反过来就不行:如果文件没扩展名(如上传时被重命名成 tmp123),get_mimes() 完全失效。
-
get_mimes()是纯客户端/扩展名驱动,适合表单校验、生成Accept头、预设上传白名单 - 真实内容检测必须用
finfo_open(FILEINFO_MIME_TYPE),不能跳过 - CI3 的
upload类默认只校验扩展名(靠get_mimes()),不校验内容,需手动开启'detect_mime' => TRUE,且依赖服务器fileinfo扩展 - CI4 的
FileUpload默认启用 MIME 探测,但底层仍走finfo,和get_mimes()无关
真正要注意的不是怎么调用 get_mimes(),而是想清楚你要解决的问题:是限制用户可上传的扩展名?还是验证文件实际内容?前者靠它够用,后者它完全不参与。










