我正在使用PHP上传表格,只允许MP3文件。
上传完成后,我会分析文件以检查它是否真的是MP3。第一步是将mime类型检测为audio/mpeg
。我使用库finfo_file()
并且工作正常,但在测试期间,一些MP3文件被拒绝,因为它们的MIME类型为application/octet-stream
。
我的问题是:
答案 0 :(得分:3)
在我需要上传的大多数应用程序中,我有时会根据预定义的MIME类型列表验证浏览器(客户端)传递的MIME。这种方法做了一个普遍的假设,即如果浏览器无法传达正在上传的文件的MIME类型的可疑内容,我可能不想在此时费心处理它。
<?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手册明确指出,如果浏览器提供此信息,则此信息可用,并且未在服务器端检查MIME类型,因此不应将其视为理所当然。
要考虑的一件事是服务器上的资源可用性,它允许您验证文件的真实MIME类型。
作为PHP开发人员,我们非常喜欢在大多数情况下创建独立于平台的代码的灵活性(例如,我们在运行XAMPP的Windows系统上构建的Web应用程序可以部署到Linux托管环境,只需很少的修改)。但是,在验证MIME类型时,我们开始引入平台相关方法,需要验证这些工具的存在(例如“file”或“finfo_file”)。
这可能是一个值得学习的实现(取自CodeIgniter GitHub存储库),它使用这些工具,并且就像你将要进入PHP范围内的工作示例一样彻底:
如果可能,文件MIME类型会检测上传文件的(实际)MIME类型。 https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Upload.php#L983
<强>来源强>
PHP手册 POST方法上传 - http://www.php.net/manual/en/features.file-upload.post-method.php
网站管理员工具包 Mime类型 - http://www.webmaster-toolkit.com/mime-types.shtml
FILExt .MP3文件 - http://filext.com/file-extension/MP3
答案 1 :(得分:0)
如果您想要一种非常强大的方法来检测文件类型而不仅仅信任客户端提供正确的MIME类型,请在UNIX上使用file实用程序。
$ 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+
在PHP中,您可以使用exec函数来调用它。
答案 2 :(得分:0)
除了MIME之外,文件检测的最佳方法是使用“魔术字节”或“幻数”方案。 Unix file
(以及finfo_file
)实际上使用“魔术字节”来执行此文件检测。所以,简而言之:是的。
不要太担心文件的外观,更多关于你可以用它做什么。只要它播放,该文件应该没问题。
如果确实想要做更多事情,您可以自己检查魔术字节。有a list of them here。