PHP $ _FILES MIME类型返回null

时间:2012-03-11 09:23:23

标签: php file audio file-upload mime-types

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

但是,某些MIME类型将返回null。

以下是一些代码片段:

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

据我所知,type应该返回文件的MIME类型。在这种情况下,'audio / mp4a-latm'表示.m4a文件。

如果php正确地为.m4a文件返回null,那么确保我实际处理音频文件的最佳方法是什么?除了解析文件扩展名之外还有其他更明确的内容吗? (确保某人没有更改说文本文件的扩展名)

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

$_FILES['userfile']['type'] - 文件的mime类型,如果浏览器提供此信息

http://www.php.net/manual/en/features.file-upload.post-method.php

这就是为什么这种方法效果不好的原因。您应该比较从

抓取的文件扩展名
$_FILES['userfile']['name']

带有可接受的扩展数组(您应该自己创建)

答案 2 :(得分:0)

要获取文件的mime类型,可以使用

http://code.google.com/p/filing-cabinet/source/browse/trunk/mime_type_lib.php?spec=svn127&r=127

我使用它超过2年,到目前为止它是非常可靠的库。

答案 3 :(得分:0)

如果您使用的是php 5.3或更高版本,则可以通过在php.ini中转义此行来激活php文件信息扩展名:

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);

这比使用浏览器通过$_FILES请求在POST数组中向您发送的内容更可靠。