【问题标题】:PHP $_FILES MIME type returning nullPHP $_FILES MIME 类型返回 null
【发布时间】:2012-03-28 01:38:06
【问题描述】:

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

但是,某些 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,那么确保我实际处理音频文件的最佳方法是什么?除了解析文件扩展名之外,还有什么更明确的吗? (确保有人没有更改文本文档的扩展名)

【问题讨论】:

  • 我不确定为什么它在您的情况下没有返回正确的文件类型(可能缺少一些简单的东西——它应该),但是如果 .m4a 的 mime 类型被定义为服务器上的音频(即使在共享主机环境中,您通常也可以自己定义),那么通过扩展进行检查并没有太大的危险。不过,我同意实际解决问题会更好。

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


【解决方案1】:

如果您使用 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);

这比使用浏览器从您的POST 请求中发送给您的$_FILES 数组更可靠。

【讨论】:

    【解决方案2】:

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

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

    我已经使用了 2 年多了,到目前为止它是非常可靠的库。

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 扩展主题-您可以避免重新发明轮子并使用Fileinfo检查文件
        • @ashein 非常好。这是一个非常不愉快的重新创建轮子。 (提问者:在 99% 的情况下,扩展程序的白名单通常就足够了。)
        • 扩展也很不可靠:)
        猜你喜欢
        • 2020-01-09
        • 2016-08-18
        • 2011-07-10
        • 1970-01-01
        • 2011-08-21
        • 2021-09-13
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        相关资源
        最近更新 更多