【问题标题】:Finfo_file on uploaded file to determine mime-type上传文件上的 Finfo_file 以确定 mime 类型
【发布时间】:2012-03-16 12:52:20
【问题描述】:

我正在尝试确定上传文件的 mime 类型,我想使用 fileinfo(),这是我一直在尝试的,它不起作用:

$uploadedfile = $_FILES['soup']['tmp_name'];
if(isset($uploadedfile))
{
    $uploadedname = $_FILES['soup']['name'];
    $file=$uploadedsong;
    $file.=$uploadedname;
    $finfo = finfo_open(FILEINFO_MIME_TYPE); 
    $mime = finfo_file($finfo, $file);

不幸的是,finfo_file 似乎没有运行,我假设我为此设置了错误的以下$file,有没有办法我可以像这样使用$_FILE 正确地使用新上传的文件来做到这一点?还是我以完全不正确的方式解决这个问题。使用我直接在另一个中预先设置的文件,并设置$file="folder/file.doc" 可以正常工作。

【问题讨论】:

    标签: php linux mime-types fileinfo


    【解决方案1】:

    您应该传递给 finfo_file 函数的路径而不是文件名。

    <?php 
    if (isset($_FILES['soup']['tmp_name'])) {
        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $mime = finfo_file($finfo, $_FILES['soup']['tmp_name']);
        if ($mime == 'application/msword') {
            //Its a doc format do something
        }
        finfo_close($finfo);
    }
    ?>
    

    【讨论】:

    • 在您的 php.ini 文件中,确保您有以下条目:extension=fileinfo.so 或在 Windows 中:php_fileinfo.dll
    • 注意:如果文档的类型为 xlsxdocxpptx 等,它将无法正常工作,因为它将返回 inode/x-emptypdf 将返回 text/html 而不是application/pdf
    【解决方案2】:

    我使用下面的php平台的finfo()buffer()函数以及file_get_contents()

    $finfo = new finfo(FILEINFO_MIME);
    $mimetype = $finfo->buffer(file_get_contents($filename)); #gives you mime type
    

    您需要使用php 5.3 或更高版本,并确保已安装finfo() 扩展。对于 linux extension=fileinfo。在 Windows 中:php_fileinfo.dll

    您可以拥有一个可接受的 mime 类型数组,然后检查它是否存在于该数组中

    $acceptedMime = [];
    if(in_array($mimetype, $acceptedMime, true) === true){
      #mime type is valid. Proceed!
    }
    

    另一种避免检查 mime 类型的方法是将文件上传完全存储在文档根文件夹之外。

    【讨论】:

      【解决方案3】:

      我知道这有点老了,但是由于您使用的是$_FILES 超级全局,您可以使用文件数组的 type 键(即$_FILES['soup']['type'])而不是使用文件上传后服务器检查?

      【讨论】:

      • 使用 $_FILES 数组参数来验证文件类型是否具有欺骗性。这就是创建 finfo_file 的原因,因此我们实际上可以检查文件的二进制文件以确定它是否真的是图像文件,而不是文件扩展名重命名为 jpg 的 php 文件,在这种情况下 $_FILES 数组类型将给个jpg。
      • 欺骗 php 文件的第一个字节以欺骗 finfo_file 认为它是 jpg 仍然很容易。
      猜你喜欢
      • 2012-02-02
      • 2011-06-09
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2016-01-25
      相关资源
      最近更新 更多