PHP如何检查文件是mp3还是图像文件?

时间:2010-01-05 14:32:39

标签: php mime-types

我如何检查文件是否是mp3文件或图像文件,而不是检查每个可能的扩展名?

11 个答案:

答案 0 :(得分:30)

获取mimetype的本地方法:

对于PHP< 5.3使用mime_content_type()
对于PHP> = 5.3,请使用finfo_fopen()

获取MimeType的替代方法是exif_imagetypegetimagesize,但这些依赖于安装了适当的库。此外,他们可能只返回图像mimetypes,而不是magic.mime中给出的整个列表。

如果您不想打扰系统中可用的内容,只需将所有四个函数包装到一个代理方法中,该方法将函数调用委托给任何可用的函数,例如。

function getMimeType($filename)
{
    $mimetype = false;
    if(function_exists('finfo_fopen')) {
        // open with FileInfo
    } elseif(function_exists('getimagesize')) {
        // open with GD
    } elseif(function_exists('exif_imagetype')) {
       // open with EXIF
    } elseif(function_exists('mime_content_type')) {
       $mimetype = mime_content_type($filename);
    }
    return $mimetype;
}

答案 1 :(得分:24)

您可以使用getimagesize识别图像文件。

要了解有关MP3和其他音频/视频文件的更多信息,建议我使用 php-mp4info getID3()

答案 2 :(得分:6)

要查找文件的mime类型,我使用以下包装函数:

function Mime($path)
{
    $result = false;

    if (is_file($path) === true)
    {
        if (function_exists('finfo_open') === true)
        {
            $finfo = finfo_open(FILEINFO_MIME_TYPE);

            if (is_resource($finfo) === true)
            {
                $result = finfo_file($finfo, $path);
            }

            finfo_close($finfo);
        }

        else if (function_exists('mime_content_type') === true)
        {
            $result = preg_replace('~^(.+);.*$~', '$1', mime_content_type($path));
        }

        else if (function_exists('exif_imagetype') === true)
        {
            $result = image_type_to_mime_type(exif_imagetype($path));
        }
    }

    return $result;
}

答案 3 :(得分:4)

尝试mime_content_type()

<?php
echo mime_content_type('php.gif') . "\n";
echo mime_content_type('test.php');
?> 

输出:

  

图像/ GIF

     

文本/纯

或者更好地使用finfo_file(),另一种方式是已弃用

答案 4 :(得分:3)

getimageinfo最适合查找图片。 检查返回类型是否为false。

答案 5 :(得分:2)

您可以使用自5.3以来内置于PHP中的FileInfo模块。如果您使用的PHP版本低于PHP 5.3,则可以将其安装为PECL扩展:

安装后,finfo_file函数将返回文件信息。

PECL扩展:http://pecl.php.net/package/fileinfo

PHP文档:http://www.php.net/manual/en/book.fileinfo.php

答案 6 :(得分:2)

您可以像这样使用finfo

$mime = finfo_open(FILEINFO_MIME, $path_to_mime_magic_file);
if ($mime ===FALSE) {
    throw new Exception ('Finfo could not be run');
}
$filetype = finfo_file($mime, $filename);
finfo_close($mime);

或者如果你没有安装finfo的问题,或者mime魔术文件没有工作(它在我们的4台服务器中的3台上运行正常 - 所有相同的操作系统和PHP安装) - 那么尝试使用Linux的本机文件(不要不要忘记清理文件名:在这个例子中,我知道文件名可以信任,因为它是我测试代码中的PHP临时文件名):

ob_start();
system('file -i -b '.$filename);
$output = ob_get_clean();
$output = explode("; ", $output);
if (is_array($output)) {
     $filetype = trim($output[0]);
}

然后将mime文件类型传递给switch语句,如:

switch (strtolower($filetype)) {
            case 'image/gif':
                return '.gif';
                break;
            case 'image/png':
                return '.png';
                break;
            case 'image/jpeg':
                return '.jpg';
                break;
            case 'audio/mpeg':
                return '.mp3';
                break;
}
return null;

答案 7 :(得分:1)

此函数检查文件是否为基于扩展名和mime的图像,如果是兼容浏览器的图像,则返回true ...

function checkImage($image) {

//checks if the file is a browser compatible image

$mimes = array('image/gif','image/jpeg','image/pjpeg','image/png');
//get mime type
$mime = getimagesize($image);
$mime = $mime['mime'];

$extensions = array('jpg','png','gif','jpeg');
$extension = strtolower( pathinfo( $image, PATHINFO_EXTENSION ) );

if ( in_array( $extension , $extensions ) AND in_array( $mime, $mimes ) ) return TRUE; 
else return FALSE; 

}

答案 8 :(得分:0)

对于图像,我使用:

    function is_image($path)
   {
    $a = getimagesize($path);
    $image_type = $a[2];

    if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP)))
    {
        return true;
    }
    return false;
    }

答案 9 :(得分:0)

最好的方法是使用finfo_file函数。 例如:

<?php 
if (isset($_FILES['yourfilename']['tmp_name'])) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime = finfo_file($finfo, $_FILES['yourfilename']['tmp_name']);
    if ($mime == 'image/jpg') {
        echo "It's an jpg image!";
    }
    finfo_close($finfo);
}
?>

答案 10 :(得分:0)

此函数获取文件路径,如果支持,则使用finfo_openmime_content_type,返回imagevideoaudio字符串。

/**
 * get file type
 * @return image, video, audio
 */
public static function getFileType($file)
{
    if (function_exists('finfo_open')) {
        if ($info = finfo_open(defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME)) {
            $mimeType = finfo_file($info, $file);
        }
    } elseif (function_exists('mime_content_type')) {
        $mimeType = mime_content_type($file);
    }
    if (strstr($mimeType, 'image/')) {
        return 'image';
    } else if (strstr($mimeType, 'video/')) {
        return 'video';
    } else if (strstr($mimeType, 'audio/')) {
        return 'audio';
    } else {
        return null;
    }
}