XAMPP中fileinfo扩展默认未启用,需确认C:\xampp\php\ext\php_fileinfo.dll存在,编辑C:\xampp\php\php.ini取消;extension=php_fileinfo.dll注释,确保extension_dir正确,重启Apache后用php -m | findstr fileinfo验证。

确认 XAMPP 中 fileinfo 扩展是否已存在
Windows 下 XAMPP(尤其是 8.2+ 版本)通常已预编译 php_fileinfo.dll,但默认未启用。先别急着改配置,先验证文件是否存在:
打开资源管理器,进入 C:\xampp\php\ext 目录,查找是否有 php_fileinfo.dll;若没有,说明当前 PHP 版本未打包该扩展,需手动补全或升级 XAMPP。
启用 fileinfo 的三步操作(XAMPP 专用路径)
XAMPP 的 php.ini 路径固定为 C:\xampp\php\php.ini,修改它即可生效,无需编译:
- 用记事本或 VS Code 打开
C:\xampp\php\php.ini - 搜索
;extension=fileinfo或;extension=php_fileinfo.dll,去掉行首分号(注意:XAMPP Windows 版必须写成php_fileinfo.dll,不是fileinfo.so) - 确认
extension_dir指向正确:extension_dir = "C:\xampp\php\ext"(若被注释或路径错误,php_fileinfo.dll就会加载失败) - 保存文件,重启 Apache(通过 XAMPP 控制面板点击 Stop → Start)
验证命令(在 CMD 中执行):C:\xampp\php\php.exe -m | findstr fileinfo,输出 fileinfo 即成功。
上传文件时用 finfo_file 做真实类型检测
开启扩展只是前提,真正防止伪造文件(比如把 .php 改名成 .jpg 上传)得靠代码层校验。别依赖 $_FILES['file']['type'] —— 浏览器传来的这个值完全不可信。
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
正确做法是用 finfo_open 读取魔术字节:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $_FILES['file']['tmp_name']);
finfo_close($finfo);
// 示例白名单校验
$allowedTypes = ['image/jpeg', 'image/png', 'application/pdf'];
if (!in_array($mimeType, $allowedTypes)) {
die('不支持的文件类型');
}
注意:FILEINFO_MIME_TYPE 返回的是 MIME 类型字符串(如 image/jpeg),比 FILEINFO_MIME 更简洁;若需更严格判断(比如区分 PNG 和 GIF),可加 FILEINFO_PRESERVE_ATIME 配合二进制头校验。
常见失败原因和绕过点
即使 php -m 显示 fileinfo 已加载,上传检测仍可能失效,原因常出在这些地方:
- Apache 和 CLI 使用不同
php.ini:XAMPP 的 Apache 加载的是C:\xampp\apache\bin\php.ini(旧版)或C:\xampp\php\php.ini(新版),务必确认你改的是 Apache 实际读取的那个 -
finfo_open失败却不报错:Windows 下若C:\xampp\share\misc\magic文件缺失或权限受限,finfo_open会静默返回false,需加判断:if (!$finfo) die('finfo 初始化失败') - 临时文件已被移动或删除:调用
finfo_file前确保$_FILES['file']['tmp_name']仍有效,且没被move_uploaded_file提前处理 - PHP 运行模式差异:XAMPP 默认是 Apache 模块模式(不是 CGI/FPM),所以不用管
php-fpm重启,只重启 Apache 即可
最易忽略的一点:XAMPP 升级后(比如从 8.2 到 8.4),新版本 php.ini 是空白模板,旧的扩展启用项不会自动继承——每次升级都得重新检查并补上 extension=php_fileinfo.dll。

















