Comment puis-je trouver le type mime d'un fichier avec php?

Ok, donc j'ai un index.fichier php qui doit traiter de nombreux types de fichiers différents. Comment puis-je deviner le type de fichier basé sur le REQUEST_URI.

Si je demande http://site/image.jpg, et toutes les demandes redirigent via index.php, qui ressemble à ceci

<?php
   include('/www/site'.$_SERVER['REQUEST_URI']);
?>

Comment ferais-je que cela fonctionne correctement?

Dois-je tester basée sur l'extension du fichier demandé, ou est-il un moyen d'obtenir le type de fichier?

47
demandé sur j0k 2008-09-25 21:51:52

13 réponses

Si vous êtes sûr que vous travaillez uniquement avec des images, vous pouvez consulter le getimagesize() exif_imagetype () fonction PHP, qui tente de retourner l'image de type mime.

Si cela ne vous dérange pas les dépendances externes, vous pouvez également consulter l'excellente bibliothèque getID3 qui peut déterminer le type mime de nombreux types de fichiers différents.

Enfin, vous pouvez consulter la fonction mime_content_type () - mais elle a été obsolète pour l'extensionFileinfo PECL.

49
répondu leek 2014-02-26 04:46:14

Mime_content_type () est obsolète, donc vous ne pourrez pas compter sur le fait qu'il fonctionne dans le futur. Il y a une extension PECL" fileinfo", mais je n'ai pas entendu de bonnes choses à ce sujet.

Si vous utilisez un serveur * nix, vous pouvez faire ce qui suit, ce qui a bien fonctionné pour moi:

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
22
répondu Eric_WVGG 2012-02-14 13:53:10
function get_mime($file) {
  if (function_exists("finfo_file")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $mime;
  } else if (function_exists("mime_content_type")) {
    return mime_content_type($file);
  } else if (!stristr(ini_get("disable_functions"), "shell_exec")) {
    // http://stackoverflow.com/a/134930/1593459
    $file = escapeshellarg($file);
    $mime = shell_exec("file -bi " . $file);
    return $mime;
  } else {
    return false;
  }
}

Pour moi, rien de cela ne fonctionne - mime_content_type est obsolète, finfo n'est pas installé, et shell_exec n'est pas autorisé.

17
répondu Ale 2012-11-26 04:46:01

En fait, j'en ai eu marre de l'absence de méthodes de reniflage MIMEstandard en PHP. Installez fileinfo... Utilisez des fonctions obsolètes... Oh ces travaux, mais seulement pour les images! J'en ai marre, alors j'ai fait des recherches et j'ai trouvé la spécification WHATWG Mimesniffing - je crois que c'est toujours une spécification de projet.

Quoi qu'il en soit, en utilisant cette spécification, j'ai pu implémenter un mimesniffer en PHP. La Performance n'est pas un problème. En fait, sur mon humble machine, j'ai pu ouvrir et renifler des milliers de fichiers avant PHP ont expiré.

Voici la classe MimeReader .

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.
10
répondu Shane 2016-09-09 02:59:29

Si vous travaillez uniquement avec des Images et que vous avez besoin d'un type mime (par exemple pour les en-têtes), alors c'est la réponse la plus rapide et la plus directe:

$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));

Il affichera le type MIME image true même si vous renommez votre fichier image

8
répondu Andrew 2013-03-06 19:52:28

Selon le manuel php, la fonction finfo-file est la meilleure façon de le faire. Cependant, vous devrez installer l'extensionFileInfo PECL.

Si l'extension n'est pas une option, vous pouvez utiliser la fonction mime_content_type obsolète.

1
répondu Devon 2008-09-25 18:01:38

mime_content_type() semble être la voie à suivre, malgré les commentaires ci-dessus disant qu'il est obsolète. Ce n'est pas -- ou du moins cette incarnation de mime_content_type() n'est pas dépréciée, selon http://php.net/manual/en/function.mime-content-type.php . il fait partie de L'extension FileInfo, mais la documentation PHP nous dit Maintenant qu'il est activé par défaut à partir de PHP 5.3.0.

1
répondu David 2016-01-31 05:20:22

Vous pouvez utiliser finfo pour cela à partir de PHP 5.3:

<?php
$info = new finfo(FILEINFO_MIME_TYPE);
echo $info->file('myImage.jpg');
// prints "image/jpeg"

L'indicateur FILEINFO_MIME_TYPE est facultatif; sans cela, vous obtenez une chaîne plus verbeuse pour certains fichiers; (apparemment, certains types d'image retourneront des informations de taille et de profondeur de couleur). L'utilisation de L'indicateur FILEINFO_MIME renvoie le type mime et l'encodage si disponible (par exemple image / png; charset = binary ou text / x-php; charset = us-ascii). Voir ce site pour plus d'informations.

1
répondu jhaagsma 2016-10-12 17:34:25

Je ne l'ai pas utilisé, mais il y a une extension PECL pour obtenir le type mimetype d'un fichier. La documentation officielle pour cela est dans le manuel .

Selon vos objectifs, une extension de fichier peut être correcte, mais elle n'est pas incroyablement fiable car elle est si facilement changée.

0
répondu enobrev 2008-09-25 18:00:47

J'ai obtenu de très bons résultats en utilisant une fonction utilisateur de http://php.net/manual/de/function.mime-content-type.php @"john dot howard au prismmg dot com 26-Oct-2009 03:43"

function get_mime_type($filename, $mimePath = '../etc') { ...

Qui n'utilise pas finfo, exec ou fonction obsolète

Fonctionne bien aussi avec des ressources à distance!

0
répondu vizzy 2012-09-12 11:59:28

Si vous ne traitez que des images, vous pouvez utiliser la fonction [getimagesize()][1] qui contient toutes sortes d'informations sur l'image, y compris le type.

Une approche plus générale consisterait à utiliser L'extension FileInfo de PECL. La documentation PHP pour cette extension peut être trouvée à: http://us.php.net/manual/en/ref.fileinfo.php

Certaines personnes se plaignent sérieusement de cette extension... donc si vous rencontrez des problèmes graves ou ne pouvez pas installer l'extension pour une raison quelconque, vous pourriez vouloir vérifier la fonction obsolète mime_content_type()

0
répondu phatduckk 2014-05-22 13:20:25

Si vous exécutez Linux et que vous avez l'extension, vous pouvez simplement lire le type MIME dans /etc / mime.types en faisant un tableau de hachage. Vous pouvez ensuite stocker cela en mémoire et simplement appeler le MIME par clé de tableau:)

/**
 * Helper function to extract all mime types from the default Linux /etc/mime.types
 */
function get_mime_types() {
    $mime_types = array();
    if (
        file_exists('/etc/mime.types') &&
        ($fh = fopen('/etc/mime.types', 'r')) !== false
    ) {
        while (($line = fgets($fh)) !== false) {
            if (!trim($line) || substr($line, 0, 1) === '#') continue;
            $mime_type = preg_split('/\t+/', rtrim($line));
            if (
                is_array($mime_type) &&
                isset($mime_type[0]) && $mime_type[0] &&
                isset($mime_type[1]) && $mime_type[1]
            ) {
                foreach (explode(' ', $mime_type[1]) as $ext) {
                    $mime_types[$ext] = $mime_type[0];
                }
            }
        }
        fclose($fh);
    }
    return $mime_types;
}
0
répondu techouse 2016-08-24 18:58:38

Le mime de n'importe quel fichier sur votre serveur peut être obtenu avec ceci

<?php
function get_mime($file_path){
  $finfo = new finfo(FILEINFO_MIME_TYPE);
  $type  = $finfo->file(file_path);
}

$mime = get_mime('path/to/file.ext');
0
répondu Joshua 2017-11-28 01:02:59