49 votes

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

Ok, donc j'ai un index.php fichier qui a à traiter de nombreux types de fichiers différents. comment puis-je suppose que le type de fichier basé sur le REQUEST_URI.

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

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

Comment pourrais-je faire ce travail correctement?

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

51voto

leek Points 4668

Si vous êtes sûr que vous êtes de ne jamais travailler avec des images, vous pouvez consulter la getimagesize() exif_imagetype() fonction PHP, qui tente de retourner l'image mime-type.

Si vous n'avez pas l'esprit de dépendances externes, vous pouvez aussi consulter l'excellent getID3 bibliothèque qui peut déterminer le type mime de nombreux types de fichiers différents.

Enfin, vous pouvez consulter la mime_content_type() - , mais elle a été supprimée pour la Fileinfo extension PECL.

23voto

Eric_WVGG Points 735

mime_content_type() est obsolète, donc vous ne serez pas en mesure de compter sur le travail dans l'avenir. Il y a un "fileinfo" extension PECL, mais je n'ai pas entendu de bonnes choses à ce sujet.

Si vous êtes en cours d'exécution sur un *nix serveur, vous pouvez effectuer les opérations suivantes, qui a bien fonctionné pour moi:

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.

18voto

Ale Points 718
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é.

10voto

Shane Points 750

J'ai effectivement eu marre par l'absence de standard de détection MIME méthodes en PHP. Installer fileinfo... Utilisation déconseillée fonctions... Oh ces travaux, mais uniquement pour les images! J'en ai eu marre, j'ai donc fait quelques recherches et trouvé le WHATWG Mimesniffing spec - je crois que c'est encore un projet de spec.

De toute façon, l'utilisation de cette spécification, j'ai été en mesure de mettre en œuvre un mimesniffer en PHP. La Performance n'est pas un problème. En fait, à mon humble machine, j'ai été en mesure d'ouvrir et de renifler des milliers de fichiers avant de PHP expiré.

Voici la MimeReader classe.

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->get_type();     // "image/jpeg" etc.

8voto

Andrew Points 216

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

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

Elle renvoie true image type mime même si vous renommez votre fichier image

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X