最可靠方式是用 finfo 扩展读取文件头识别 mime 类型;备用方案为手动比对魔数;上传时需扩展名与 mime 双重校验,禁用 getimagesize 和 mime_content_type。

PHP判断音频文件类型,不能只依赖扩展名,因为扩展名容易被伪造。最可靠的方式是读取文件头(即魔数),结合 finfo 扩展(基于 libmagic)来识别真实 MIME 类型。
使用 finfo 扩展识别(推荐)
finfo 是 PHP 内置的文件信息识别模块,能准确解析二进制头部数据,支持常见音频格式(MP3、WAV、FLAC、AAC、OGG 等)。
- 确保 PHP 已启用
fileinfo扩展(查看phpinfo()或运行extension_loaded('fileinfo')) - 代码示例:
$file = '/path/to/audio.mp3';
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mimeType = finfo_file($finfo, $file);
finfo_close($finfo);
if ($mimeType === 'audio/mpeg') {
echo "这是 MP3 文件";
} elseif ($mimeType === 'audio/wav' || $mimeType === 'audio/x-wav') {
echo "这是 WAV 文件";
} elseif (str_starts_with($mimeType, 'audio/')) {
echo "这是一个音频文件:{$mimeType}";
} else {
echo "不是识别出的音频类型";
}
手动检查文件头(备用方案,不依赖扩展)
当无法启用 fileinfo 时,可读取文件前几个字节比对魔数(Magic Number)。注意需以二进制方式打开,并处理不同编码长度。
- MP3:开头为
ID3(带标签)或\xFF\xFB/\xFF\xF3等帧同步字节(实际检测需更严谨) - WAV:第 9–12 字节为
WAVE(完整头部偏移 8,长度 4) - FLAC:前 4 字节为
fLaC - OGG:前 4 字节为
OggS
简易示例(仅检测 WAV 和 FLAC):
$header = file_get_contents($file, false, null, 0, 4);
if ($header === 'RIFF') {
// 再读 8 字节跳过 RIFF 头,检查是否为 WAVE
$waveSig = file_get_contents($file, false, null, 8, 4);
if ($waveSig === 'WAVE') echo "WAV 文件";
} elseif ($header === 'fLaC') {
echo "FLAC 文件";
}
结合扩展名与 MIME 做双重校验
上传场景中建议同时验证扩展名和真实类型,防止绕过:
- 提取扩展名:
$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION)); - 检查是否在白名单内(如
['mp3', 'wav', 'flac', 'ogg', 'aac']) - 再用
finfo验证 MIME 是否匹配对应音频类型 - 拒绝扩展名与内容严重不符的文件(如
.jpg但实际是 MP3)
注意事项
- 不要用
getimagesize()判断音频——它只支持图像 -
mime_content_type()已废弃,应改用finfo - 某些容器格式(如 MP4/AAC)可能返回
video/mp4,需进一步检查audio/mp4或通过 FFmpeg 解析流信息 - 小文件(
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











