必须手动取消注释extension=fileinfo并确保修改的是apache实际加载的php.ini(通常为c:\xampp\apache\bin\php.ini),同时确认extension_dir指向含php_fileinfo.dll的目录,最后重启apache;否则finfo_open()将报错class 'finfo' not found。

必须手动取消注释 extension=fileinfo,且确保 php.ini 是 Apache 实际加载的那一个 —— 否则 finfo_open() 会直接报错 Class 'finfo' not found。
确认 XAMPP 正在用哪个 php.ini
很多人改了错的 php.ini 文件,导致重启 Apache 后依然无效。XAMPP 有两个常见位置:
-
C:\xampp\php\php.ini(CLI 命令行 PHP 使用) -
C:\xampp\apache\bin\php.ini(Apache 模块实际加载的配置)
Apache 默认读取的是后者。验证方法:新建一个 info.php 放到 C:\xampp\htdocs\ 下,内容为 <?php phpinfo(); ?>,浏览器访问 http://localhost/info.php,搜索 “Loaded Configuration File”,看路径是否指向 apache\bin\php.ini。如果不是,就去那个路径改。
取消注释并检查 extension_dir
打开正确的 php.ini(通常是 C:\xampp\apache\bin\php.ini),搜索 fileinfo。你会看到类似这一行:
;;extension=fileinfo
把开头两个分号去掉,改成:
extension=fileinfo
接着确认 extension_dir 指向正确位置(XAMPP 默认是 "C:\xampp\php\ext")。检查该目录下是否存在 php_fileinfo.dll(Windows 下是 DLL,不是 SO)。如果不存在,说明 PHP 安装包损坏或精简版被删过扩展 —— 需重装 XAMPP 或从完整版复制该文件。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
重启 Apache 并验证是否生效
改完配置不重启等于白改。必须在 XAMPP 控制面板中点击 Apache → Stop,再点 Start。
验证方式有两种:
- 命令行执行:
C:\xampp\apache\bin\httpd.exe -t确保配置语法无误 - 访问
info.php页面,搜索 “fileinfo”,看到模块已启用;或运行:C:\xampp\php\php.exe -m | findstr fileinfo(Windows CMD)
若仍报错 Class 'finfo' not found,大概率是:改了 CLI 的 php.ini 却没改 Apache 的,或者 extension_dir 路径里压根没有 php_fileinfo.dll。
用 finfo_file() 安全获取上传文件 MIME 类型
启用后别直接信 $_FILES['file']['type'] —— 浏览器传的这个值完全可控,毫无安全性可言。正确做法是用 finfo_file() 检查临时文件:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
if (!in_array($mimeType, ['image/jpeg', 'image/png', 'application/pdf'])) {
die('不支持的文件类型');
}
注意:finfo_open() 第二个参数可选 magic 文件路径(如 C:\xampp\php\extras\magic),但 XAMPP 自带的 DLL 已内置 magic 数据,一般不用额外指定;若遇到识别不准(比如 WebP 识别成 application/octet-stream),才需更新 magic 文件。
最容易被忽略的一点:XAMPP 的 Apache 和 CLI 使用两套独立的 php.ini,改完必须确认 Apache 加载的是哪一个,且 php_fileinfo.dll 确实存在于它声明的 extension_dir 目录里 —— 少一个环节,finfo 类就永远找不到。










