2009-08-05 9 views
15

J'utilise PHP pour envoyer un email avec une pièce jointe. La pièce jointe peut être l'un des différents types de fichiers (pdf, txt, doc, swf, etc.). D'abord, le script obtient le fichier en utilisant "file_get_contents".Comment obtenir le type de contenu d'un fichier en PHP?

Plus tard, le script fait écho dans l'en-tête:

Content-Type: <?php echo $the_content_type; ?>; name="<?php echo $the_file_name; ?>" 

Comment je définir la valeur correcte pour the_content_type $?

Répondre

-2

Il est l'en-tête de la fonction:

header('Content-Type: '.$the_content_type); 

Notez que cette fonction doit être appelée avant toute sortie. Vous trouverez plus de détails dans la référence http://php.net/header

Edit:

Ops, j'ai mal compris la question: Depuis PHP 4.0, il y a la fonction mime_content_type pour détecter le type MIME d'un fichier.

En php 5 est obsolète, doit être remplacé par le file info ensemble de fonctions.

+0

Je pense que ce n'est pas la question ... ed.talmage doit déterminer le type de mime/type de contenu du fichier joint, l'en-tête est déjà pris soin de. – JorenB

+0

Pris! En passant, je ne faisais que modifier la réponse;) – Eineki

4

Voici un exemple en utilisant finfo_open qui est disponible en PHP5 et PECL:

$mimepath='/usr/share/magic'; // may differ depending on your machine 
// try /usr/share/file/magic if it doesn't work 
$mime = finfo_open(FILEINFO_MIME,$mimepath); 
if ($mime===FALSE) { 
throw new Exception('Unable to open finfo'); 
} 
$filetype = finfo_file($mime,$tmpFileName); 
finfo_close($mime); 
if ($filetype===FALSE) { 
throw new Exception('Unable to recognise filetype'); 
} 

Vous pouvez également utiliser la dépréciée fonction mime_ content_ type:

$filetype=mime_content_type($tmpFileName); 

ou de l'utilisation le système d'exploitation dans les fonctions intégrées:

ob_start(); 
system('/usr/bin/file -i -b ' . realpath($tmpFileName)); 
$type = ob_get_clean(); 
$parts = explode(';', $type); 
$filetype=trim($parts[0]); 
-3

essayez ceci:

function ftype($f) { 
        curl_setopt_array(($c = @curl_init((!preg_match("/[a-z]+:\/{2}(?:www\.)?/i",$f) ? sprintf("%s://%s/%s", "http" , $_SERVER['HTTP_HOST'],$f) : $f))), array(CURLOPT_RETURNTRANSFER => 1, CURLOPT_HEADER => 1)); 
         return(preg_match("/Type:\s*(?<mime_type>[^\n]+)/i", @curl_exec($c), $m) && curl_getinfo($c, CURLINFO_HTTP_CODE) != 404) ? ($m["mime_type"]) : 0; 

     } 
echo ftype("http://img2.orkut.com/images/medium/1283204135/604747203/ln.jpg"); // print image/jpeg 
+11

Saint opérateur ternaire illisible, Batman! ;-P – deceze

25

J'utilise cette fonction, qui comprend plusieurs solutions de repli pour compenser les anciennes versions de PHP ou des résultats simplement mauvais:

function getFileMimeType($file) { 
    if (function_exists('finfo_file')) { 
     $finfo = finfo_open(FILEINFO_MIME_TYPE); 
     $type = finfo_file($finfo, $file); 
     finfo_close($finfo); 
    } else { 
     require_once 'upgradephp/ext/mime.php'; 
     $type = mime_content_type($file); 
    } 

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) { 
     $secondOpinion = exec('file -b --mime-type ' . escapeshellarg($file), $foo, $returnCode); 
     if ($returnCode === 0 && $secondOpinion) { 
      $type = $secondOpinion; 
     } 
    } 

    if (!$type || in_array($type, array('application/octet-stream', 'text/plain'))) { 
     require_once 'upgradephp/ext/mime.php'; 
     $exifImageType = exif_imagetype($file); 
     if ($exifImageType !== false) { 
      $type = image_type_to_mime_type($exifImageType); 
     } 
    } 

    return $type; 
} 

Il essaie d'utiliser la nouvelles fonctions PHP finfo. Si ceux-ci ne sont pas disponibles, il utilise l'alternative mime_content_type et inclut le remplacement de la bibliothèque Upgrade.php pour s'assurer que cela existe. Si ceux-ci n'ont rien retourné d'utile, ils vont essayer la commande file du système d'exploitation. Je pense que c'est seulement disponible sur les systèmes * NIX, vous pouvez vouloir changer cela ou vous en débarrasser si vous prévoyez d'utiliser cela sur Windows. Si rien n'a fonctionné, il essaie exif_imagetype comme solution de repli pour les images seulement.

Je suis venu à remarquer que les différents serveurs varient considérablement dans leur prise en charge des fonctions de type MIME, et que le remplacement Upgrade.php mime_content_type est loin d'être parfait. Les fonctions limitées exif_imagetype, à la fois l'original et le remplacement Upgrade.php, fonctionnent assez bien cependant. Si vous êtes seulement préoccupé par les images, vous pouvez seulement vouloir utiliser ce dernier.

+0

Le repli de la commande 'file' est redondant. L'extension FileInfo (et la fonction mime_content_type) utilisent la même base de données de détection de fichiers que la commande 'file'. –

+0

@Sander Lors de mes tests, j'ai trouvé 'mime_content_type' assez peu fiable, ou peut-être que son remplacement par upgrade.php l'était, alors que l'appel de' file' est généralement réussi. Je vais devoir examiner cela davantage pour voir quand et pourquoi cela échoue dans quelles circonstances. Au moins, ça ne fait pas de mal d'être là. :) – deceze

+0

J'ai regardé le code Upgrade.php pour mime_content_type. D'abord, il essaie l'extension FileInfo PECL. Si cela n'existe pas, il essaie d'analyser le fichier 'magic' par lui-même, en PHP. Problème: Il ne regarde que quelques endroits prédéfinis pour le fichier 'magic'. Il échoue sur mon Debian Squeeze par exemple. Il est également possible que l'analyseur ait des bugs, mais je n'ai pas vérifié cela complètement. –

2
function getMimeType($filename) { 
     $realpath = realpath($filename); 
     if ($realpath 
       && function_exists('finfo_file') 
       && function_exists('finfo_open') 
       && defined('FILEINFO_MIME_TYPE') 
     ) { 
       // Use the Fileinfo PECL extension (PHP 5.3+) 
       return finfo_file(finfo_open(FILEINFO_MIME_TYPE), $realpath); 
     } 
     if (function_exists('mime_content_type')) { 
       // Deprecated in PHP 5.3 
       return mime_content_type($realpath); 
     } 
     return false; 
} 

Cela a fonctionné pour moi

Why is mime_content_type() deprecated in PHP?

0

Je suppose que je l'ai trouvé une courte distance. Obtenir la taille de l'image en utilisant:

$infFil=getimagesize($the_file_name);

et

Content-Type: <?php echo $infFil["mime"] ?>; name="<?php echo $the_file_name; ?>" 

Le getimagesize retourne un tableau associatif qui ont une clé MIME

je l'ai utilisé et il fonctionne

4

Il très facile de l'avoir en php.

Appelez simplement la fonction php suivante mime_content_type

<?php 
    $filelink= 'uploads/some_file.pdf'; 
    $the_content_type = ""; 

    // check if the file exist before 
    if(is_file($file_link)) { 
     $the_content_type = mime_content_type($file_link); 
    } 
    // You can now use it here. 

?> 

PHP documentation of the function mime_content_type() aide quelqu'un espère que ce

0

J'ai essayé la plupart des suggestions, mais ils ont tous échouent pour moi (je suis inbetween tout USEFULL version de PHP apparantly.Je me suis retrouvé avec la fonction suivante:

function getShellFileMimetype($file) { 
    $type = shell_exec('file -i -b '. escapeshellcmd(realpath($_SERVER['DOCUMENT_ROOT'].$file))); 
    if(strpos($type, ";")!==false){ 
     $type = current(explode(";", $type)); 
    } 
    return $type; 
} 
Questions connexes