我正在使用PHP编写上传表单,只允许上传MP3文件。
上传完成后,我会分析文件以检查它是否真的是MP3格式。第一步是检测MIME类型为audio/mpeg
。我使用finfo_file()
库进行检测,虽然在测试中有些MP3文件被拒绝,因为它们的MIME类型结果为application/octet-stream
。
我的问题是:
- 我的应用程序是否应该拒绝这些MP3文件?实际上它们可以播放音频。
- 为什么这个MIME类型会是MP3?
- 检测MIME类型是确定文件类型的最可靠方法吗?
我正在使用PHP编写上传表单,只允许上传MP3文件。
上传完成后,我会分析文件以检查它是否真的是MP3格式。第一步是检测MIME类型为audio/mpeg
。我使用finfo_file()
库进行检测,虽然在测试中有些MP3文件被拒绝,因为它们的MIME类型结果为application/octet-stream
。
我的问题是:
<?php
$valid_mp3_mimes = array(
'audio/mpeg',
'audio/x-mpeg',
'audio/mp3',
'audio/x-mp3',
'audio/mpeg3',
'audio/x-mpeg3',
'audio/x-mpeg-3',
'audio/mpg',
'audio/x-mpg',
'audio/x-mpegaudio',
'video/mpeg',
'video/x-mpeg',
);
$uploaded_file_mime = $_FILES['upload_field_name']['type'];
if(!in_array($uploaded_file_mime, $valid_mp3_mimes))
{
die('Upload is not a valid MP3 file.');
}
来源
PHP手册 POST方法上传 - http://www.php.net/manual/zh/features.file-upload.post-method.php
Webmaster Toolkit MIME类型 - http://www.webmaster-toolkit.com/mime-types.shtml
FILExt .MP3文件 - http://filext.com/file-extension/MP3
$ file Black\ Sands\ 01\ Prelude.mp3
Black Sands 01 Prelude.mp3: Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 320 kbps, 44.1 kHz, Stereo
$ file homework/math475-hw8.docx
homework/math475-hw8.docx: Microsoft Word 2007+
文件检测的最佳方法是使用“魔术字节”或“魔数”方案,以及MIME。Unix file
(以及finfo_file
)实际上使用“魔术字节”来进行文件检测。所以,简而言之:是的。
不要太担心你的文件长什么样子,更关注你可以用它做什么。只要能播放,文件就应该没问题。
如果你真的想做更多,你可以自己检查魔术字节。这里有一个列表。
file
命令和 PHP 的finfo_file
函数使用相同的方法来确定 MIME 类型(通常是通过引用/usr/share/misc/magic
)。当您有内置函数时,执行exec file
就没有用了。然而,我在这里遇到了一个问题,即.mp3
被finfo_file
和file -I
都检测为application/octet-stream
,而我希望它返回audio/mpeg
。两者都失败了。但是,我认为可以通过将改进后的magic
文件的路径作为第二个参数传递给finfo_open
来解决这个问题。 - Quinn Comendant