How to get MIME type of a file in PHP 5.5?

前端 未结 8 1896
鱼传尺愫
鱼传尺愫 2020-11-30 07:10

I am using mime_content_type() in PHP 5.5 to get a MIME type, but it throws fatal: error function not found.

How can I achieve this on PHP

相关标签:
8条回答
  • 2020-11-30 08:05

    This is the best solution I found by combining two very good posts

    // Thanks to http://php.net/manual/en/function.mime-content-type.php#87856

    function getMimeContentType($filename, $ext)
    {
        if(!function_exists('mime_content_type'))
        {
            if($mime_types = getMimeTypes())
            {
                if (array_key_exists($ext, $mime_types))
                {
                    return $mime_types[$ext];
                }
                elseif (function_exists('finfo_open'))
                {
                    $finfo  = finfo_open(FILEINFO_MIME);
                    $mimetype = finfo_file($finfo, $filename);
                    finfo_close($finfo);
                    return $mimetype;
                }
            }
            return 'application/octet-stream';
        }
        return mime_content_type($filename);
    }
    

    // Thanks to http://php.net/manual/en/function.mime-content-type.php#107798

    function getMimeTypes()
    {
        $url = 'http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types';
    
        $mimes = array();
        foreach(@explode("\n",@file_get_contents($url)) as $x)
        {
            if(isset($x[0]) && $x[0]!=='#' && preg_match_all('#([^\s]+)#', $x, $out) && isset($out[1]) && ($c = count($out[1])) > 1)
            {
                    for($i=1; $i < $c; $i++)
                {
                        $mimes[$out[1][$i]] = $out[1][0];
                }
            }
        }
        return (@sort($mimes)) ? $mimes : false;
    }
    

    Use it link this:

    $filename = '/path/to/the/file.pdf';
    $ext = strtolower(array_pop(explode('.',$filename)));
    $content_type = getMimeContentType($filename, $ext);
    

    Will continue to work even if the mime_content_type function is no longer supported in php.

    0 讨论(0)
  • 2020-11-30 08:08

    I've spent too much time trying to get the finfo functions to work, properly. I finally just ended up creating my own function to match the file extension to any array of mime types. It's not a full-proof way of assuring that the files are truly what the extension denotes them to be, but that problem can be mitigated by how you process I/O of said files on your server(s).

    function mime_type($file) {
    
        // there's a bug that doesn't properly detect
        // the mime type of css files
        // https://bugs.php.net/bug.php?id=53035
        // so the following is used, instead
        // src: http://www.freeformatter.com/mime-types-list.html#mime-types-list
    
        $mime_type = array(
            "3dml" => "text/vnd.in3d.3dml",
            "3g2" => "video/3gpp2",
            "3gp" => "video/3gpp",
            "7z" => "application/x-7z-compressed",
            "aab" => "application/x-authorware-bin",
            "aac" => "audio/x-aac",
            "aam" => "application/x-authorware-map",
            "aas" => "application/x-authorware-seg",
            "abw" => "application/x-abiword",
            "ac" => "application/pkix-attr-cert",
            "acc" => "application/vnd.americandynamics.acc",
            "ace" => "application/x-ace-compressed",
            "acu" => "application/vnd.acucobol",
            "adp" => "audio/adpcm",
            "aep" => "application/vnd.audiograph",
            "afp" => "application/vnd.ibm.modcap",
            "ahead" => "application/vnd.ahead.space",
            "ai" => "application/postscript",
            "aif" => "audio/x-aiff",
            "air" => "application/vnd.adobe.air-application-installer-package+zip",
            "ait" => "application/vnd.dvb.ait",
            "ami" => "application/vnd.amiga.ami",
            "apk" => "application/vnd.android.package-archive",
            "application" => "application/x-ms-application",
            // etc...
            // truncated due to Stack Overflow's character limit in posts
        );
    
        $extension = \strtolower(\pathinfo($file, \PATHINFO_EXTENSION));
    
        if (isset($mime_type[$extension])) {
            return $mime_type[$extension];
        } else {
            throw new \Exception("Unknown file type");
        }
    
    }
    

    Edit:

    I'd like to address Davuz's comment (since it keeps getting up-voted) and remind everyone that I put in the pseudo disclaimer at the top that this isn't "full-proof." So, please keep that in mind when considering the approach I've offered in my answer.

    0 讨论(0)
提交回复
热议问题