为什么在我调用mime_content_type($ mp3_file_path)的某些mp3文件时,它返回application / octet-stream?
我有这个:
if (!empty($_FILES)) {
$tempFile = $_FILES['Filedata']['tmp_name'];
$image = getimagesize($tempFile);
$mp3_mimes = array('audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio');
if (in_array(mime_content_type($tempFile), $mp3_mimes)) {
echo json_encode("mp3");
} elseif ($image['mime']=='image/jpeg') {
echo json_encode("jpg");
} else{
echo json_encode("error");
}
}
修改 我在这里找到了一个很好的课程:
http://www.zedwood.com/article/127/php-calculate-duration-of-mp3
答案 0 :(得分:9)
MP3文件在识别它们时是一种奇怪的野兽。您可以使用.wav容器存储MP3。文件开头可以有一个ID3v2标头。您可以将MP3基本上嵌入任何文件中。
可靠地检测它们的唯一方法是通过文件缓慢解析并尝试找到看起来像MP3帧的东西。帧是有效MP3数据的最小单位,表示(关闭内存)0.028秒的音频。帧的大小根据比特率和采样率而变化,因此您不能只获取第一帧的比特率/采样率并假设所有其他帧的大小相同 - 必须完整地解析VBR mp3计算总比赛时间。
所有这些归结为使用PHP的fileinfo等识别MP3是不可靠的,因为实际的MP3数据可以在文件中随时启动。 fileinfo只查看第一个千字节或两个数据,所以如果它说它不是MP3,它可能很好地说谎,因为数据开始稍微远一些。
答案 1 :(得分:2)
application/octet-stream
无法识别文件时,它可能是mime_content_type
的后备类型。
在这种情况下MP3不是真正的MP3文件,或者 - 更有可能 - 文件是真正的MP3文件,但不包含PHP函数用于识别格式的“魔术字节” - 也许是因为它是不同的子格式或具有可变比特率或其他。
您可以尝试getid3是否为您提供更好的结果。我从来没有使用它,但它看起来像一个非常健康的库,从多媒体文件中获取大量信息。
如果您可以访问PHP的配置,您也可以使用change the mime.magic
file PHP,但我不知道是否存在能够检测到MP3的更好的文件。 (mime.magic
文件是包含mime_content_type
用于识别某些文件类型的所有字节序列的文件。)
答案 2 :(得分:0)
Fleep是此问题的答案。允许应用程序/八位字节流很危险,因为.exe和其他危险文件可以使用该mime类型显示。