Comment obtenir le type MIME D'un fichier en PHP 5.5?

j'utilise mime_content_type() en PHP 5.5 pour obtenir un type MIME, mais il lance fatal: error function not found .

comment réaliser cela sur PHP 5.5?

31
demandé sur zzzzBov 2014-04-25 11:56:23

8 réponses

utiliser les fonctions finfo() .

une simple illustration:

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, "path/to/image_dir/image.gif");
finfo_close($finfo);

OUTPUT :

image/gif

Note : les utilisateurs de Windows doivent inclure le fichier DLL empaqueté php_fileinfo.dll dans php.ini pour activer cette extension.

55
répondu Shankar Damodaran 2016-11-02 07:02:57

j'ai passé trop de temps à essayer d'obtenir la finfo fonctions fonctionner correctement. J'ai finalement fini par créer ma propre fonction pour faire correspondre l'extension du fichier à n'importe quel tableau de types mime. Ce n'est pas un moyen de s'assurer que les fichiers sont vraiment ce que l'extension indique qu'ils sont, mais ce problème peut être atténué par la façon dont vous traitez les entrées/sorties de ces fichiers sur votre(s) serveur (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:

Je voudrais m'adresser à Davuz's comment (depuis il continue à obtenir voté) et rappeler à tout le monde que j'ai mis dans le pseudo disclaimer en haut que ce n'est pas "full-proof."Donc, gardez cela à l'esprit lorsque l'on considère l'approche que j'ai offert à ma réponse.

16
répondu Erutan409 2017-09-22 14:08:21

mime_content_type() n'est pas obsolète et fonctionne très bien.

pourquoi mime_content_type() est-il déprécié en PHP?

http://php.net/manual/en/function.mime-content-type.php

en PHP 5.3, c'est même intégré .

9
répondu Anuga 2017-05-23 10:31:12

$finfo = finfo_open(FILEINFO_MIME_TYPE); devrait suffire.

extrait du php.net docs. Votre fonction est dépréciée et probablement déjà supprimée.

http://www.php.net/manual/en/function.finfo-file.php

4
répondu Y U NO WORK 2014-04-25 07:59:23

vous devez comprendre que file_get_contents va télécharger le fichier entier à la mémoire, ce n'est pas une bonne façon d'obtenir seulement le type mime. Vous n'avez pas besoin d'utiliser tampon "151950920 méthode" et file_get_contents de la fonction dans ce cas.

pour éviter les erreurs et les Avertissements, mieux vaut faire comme ceci.

$filename = 'path to your file';

if (class_exists('finfo')) {
    $finfo = new finfo(FILEINFO_MIME_TYPE);
    if (is_object($finfo)) {
        echo $finfo->file($filename);
    }
} else {
    echo 'fileinfo did not installed';
}

aussi, vous devriez savoir $finfo- > le fichier lancera Avertissement PHP en cas de panne.

si fileinfo n'est pas installé correctement, et que vous avez une nouvelle version de PHP, vous pouvez obtenir le type mime des en-têtes.

vous pouvez utiliser cURL pour obtenir le type mime des en-têtes.

    $ch = curl_init();
    curl_setopt_array($ch, array(
            CURLOPT_HEADER => true,
            CURLOPT_NOBODY => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_MAXREDIRS => 1,
            CURLOPT_URL => $link)
    );

    $headers = curl_exec($ch);
    curl_close($ch);

    if (preg_match('/Content-Type:\s(.*)/i', $headers, $matches)) {
        echo trim($matches[1], "\t\n\r");
    }else {
        echo 'There is no content type in the headers!';
    }

vous pouvez aussi utiliser la fonction get_headers , mais elle est plus lente que cURL request.

$url = 'http://www.example.com';

$headers = get_headers($url, 1);

echo $headers['Content-Type'];
1
répondu madlopt 2015-06-25 11:27:07

obtenir la taille de l'image en utilisant:

$infFil=getimagesize($the_file_name);

et

echo $infFil["mime"]

le getimagesize renvoie un tableau associatif qui a une clé MIME et évidemment la taille de l'image aussi

je l'ai utilisé et ça marche

1
répondu user3348274 2015-11-21 22:20:44

j'utilise le MimeTypeTool de Bat ( https://github.com/lingtalfi/Bat )

il utilise fileinfo si disponible, et renvoie par défaut à un mappage" extension => mime type".

0
répondu ling 2015-10-25 19:18:28

C'est la meilleure solution que j'ai trouvé par la combinaison de deux très bons postes

/ / merci à 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);
}

/ / merci à 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;
}

utilisez le lien suivant:

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

continuera à fonctionner même si le la fonction mime_content_type n'est plus supportée en php.

0
répondu Llewellyn 2017-02-19 20:36:21