2012-03-11 87 views
3

现在我正在尝试编写一个脚本,它只接受某些音频文件上传到服务器。

但是,某些MIME类型被返回为空。

下面是一些代码片段:

PHP:

$allowedExt=array('audio/mp4a-latm'); 
if(isset($_POST)) 
{ 
    print_r($_FILES); 
    //ToDo: Limit by File Size 
    if(in_array($_FILES["fileUpload"]["type"],$allowedExt)){ 
    echo "file type found"; 
    } 
    else 
    echo "wrong file type"; 
} 

HTML:

<form action="php/FileUpload.php" method="POST" enctype="multipart/form-data"> 
Choose a file: <input name="fileUpload" type="file" /><br /> 
<input type="submit" value="Upload" /> 
</form> 

上述结果是:

Array ([fileUpload] => Array ([name] => 02 Helix Nebula.m4a [type] => [tmp_name] => <removed for space...>)) 
wrong file type 

从我的理解,类型应该返回文件的MIME类型。在这种情况下,用于.m4a文件的'audio/mp4a-latm'。

如果php正确返回null为.m4a文件,那么确保我实际处理音频文件的最佳方法是什么?有什么比解析文件扩展名更明确吗? (确保有人没有改变说文本文档的扩展名)

+0

我不知道为什么它不会在你的情况下返回正确的文件类型(可能缺少一些简单的东西 - 它应该),但如果。m4a的mime类型被定义为服务器上的音频(通常你甚至可以在共享主机环境中自己定义这个),那么通过扩展进行检查并没有太大的危险。不过,我同意实际解决问题会更好。 – Ynhockey 2012-03-11 09:28:47

回答

3

MIME元素来自浏览器,这意味着它可以被操纵,因此是不可信的。

请检查扩展名,或者如果您真的想要解析文件的前几个字节,以确保它是预期的。

+1

为了扩大话题 - 你可以避免重新发明轮子,并使用[Fileinfo](http://php.net/manual/en/book.fileinfo.php) – ashein 2012-03-11 10:53:48

+0

@ashein非常好的一点检查文件。这是一个非常不愉快的轮子重新创建。 (问题提供者:在99%的情况下,扩展白名单通常就足够了。) – Corbin 2012-03-11 20:08:20

+0

扩展也相当不可靠:) – Wilt 2014-11-11 17:00:35

0

如果您使用PHP 5.3或更高版本,你可以逃脱此行激活PHP文件信息扩展您的php.ini

extension=php_fileinfo.dll 

然后你就可以从PHP中的文件中像这样让你的MIME类型:

$pathToFile = 'my/path/to/file.ext'; 
$fileInfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimeType = finfo_file($fileInfo, $pathToFile); 
finfo_close($fileInfo); 

这比使用浏览器从POST请求发送给$_FILES的数组更有效。