Question

D'accord, j'ai donc un fichier index.php qui doit traiter de nombreux types de fichiers différents. comment deviner le type de fichier basé sur REQUEST_URI .

Si je demande http: //site/image.jpg , toutes les demandes sont redirigées via index.php, ce qui ressemble à ceci

<?php
   include('/www/site'.

D'accord, j'ai donc un fichier index.php qui doit traiter de nombreux types de fichiers différents. comment deviner le type de fichier basé sur REQUEST_URI .

Si je demande http: //site/image.jpg , toutes les demandes sont redirigées via index.php, ce qui ressemble à ceci

<*>

Comment puis-je le faire fonctionner correctement?

Devrais-je effectuer un test en fonction de l'extension du fichier demandé ou existe-t-il un moyen d'obtenir le type de fichier?

SERVER['REQUEST_URI']); ?>

Comment puis-je le faire fonctionner correctement?

Devrais-je effectuer un test en fonction de l'extension du fichier demandé ou existe-t-il un moyen d'obtenir le type de fichier?

Était-ce utile?

La solution

Si vous êtes certain de ne jamais travailler qu'avec des images, vous pouvez vérifier le getimagesize () exif_imagetype () Fonction PHP qui tente de renvoyer le type mime de l'image.

Si les dépendances externes ne vous dérangent pas, vous pouvez également consulter l'excellente bibliothèque getID3 qui permet de déterminer la mime-type de nombreux types de fichiers différents.

Enfin, vous pouvez consulter le mime_content_type () function - mais il est obsolète pour l’extension Fileinfo .

Autres conseils

mime_content_type () est obsolète, vous ne pourrez donc plus compter sur son efficacité. Il y a un " fileinfo " Extension PECL, mais je n’en ai pas entendu de bonnes choses.

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

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
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 tout cela ne fonctionne - type_content_mime est obsolète, finfo n'est pas installé et shell_exec n'est pas autorisé.

J'en ai vraiment marre du manque de méthodes de détection standard MIME en PHP. Installez fileinfo ... Utilisez des fonctions obsolètes ... Oh, ça marche, mais seulement pour les images! J'en ai marre, alors j'ai fait quelques recherches et trouvé les caractéristiques du WHATWG Mimesniffing - Je crois que cela est toujours un brouillon de spec.

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 sniffer des milliers de fichiers avant l’expiration du délai imparti pour PHP.

Voici la classe MimeReader .

require_once("MimeReader.php");

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

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

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

Le type mime de l'image sera généré même si vous renommez le fichier image

Selon le manuel php, le fichier finfo La fonction est la meilleure façon de le faire. Cependant, vous devrez installer l’ FileInfo extension PECL.

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

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

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 détaillée pour certains fichiers; (apparemment, certains types d’images renverront des informations sur la taille et la profondeur des couleurs). L’utilisation de l’indicateur FILEINFO_MIME renvoie le type mime et le codage s’ils sont disponibles (par exemple, image / png; charset = binaire ou text / x-php; charset = us-ascii). Voir ce site pour plus d'informations.

Je ne l'ai pas utilisé, mais il existe un extension PECL pour obtenir le type MIME d'un fichier. . La documentation officielle correspondante se trouve dans le manuel .

En fonction de vos besoins, une extension de fichier peut être correcte, mais elle n’est pas incroyablement fiable car elle peut être modifiée si facilement.

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 at prismmg dot com 26-Oct-2009 03:43 ''

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

qui n'utilise pas les fonctions finfo, exec ou obsolète

fonctionne bien aussi avec des ressources distantes!

si vous n'utilisez 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 de cette extension est disponible à l'adresse: http: //us.php .net / manual / fr / ref.fileinfo.php

Certaines personnes se plaignent sérieusement de cette extension. Par conséquent, si vous rencontrez des problèmes graves ou si vous ne pouvez pas installer l'extension pour une raison quelconque, vous voudrez peut-être consulter la fonction obsolète mime_content_type ()

Si vous utilisez Linux et que vous avez l'extension, vous pouvez simplement lire le type MIME dans /etc/mime.types en créant 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;
}

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');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top