在大多数需要上传的应用程序中,我有时会根据预定义的 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