2009-08-05 10 views
15

Sto utilizzando PHP per inviare un messaggio di posta elettronica con un allegato. L'allegato potrebbe essere uno qualsiasi dei diversi tipi di file (pdf, txt, doc, swf, ecc.).Come ottenere il tipo di contenuto di un file in PHP?

Innanzitutto, lo script ottiene il file utilizzando "file_get_contents".

Più tardi, lo script fa eco nell'intestazione:

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

Come ho impostato il valore corretto per $ the_content_type?

risposta

-2

C'è l'intestazione funzione:

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

noti che questa funzione deve essere chiamata prima qualsiasi output. Potete trovare ulteriori informazioni nel riferimento http://php.net/header

Edit:

Ops, ho frainteso la domanda: da PHP 4.0 v'è la funzione di mime_content_type per rilevare il tipo MIME di un file.

In php 5 è ​​deprecato, deve essere sostituito dal set di funzioni file info.

+0

Penso che questa non è la domanda ... ed.talmage ha bisogno di determinare il tipo/tipo di contenuto del file allegato, l'intestazione è già stata presa cura di – JorenB

+0

Catturato! Stavo solo modificando la risposta, a proposito;) – Eineki

4

Ecco un esempio utilizzando finfo_open che è disponibile in PHP5 e 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'); 
} 

In alternativa, è possibile utilizzare il deprecato mime_ content_ type funzione:

$filetype=mime_content_type($tmpFileName); 

o l'uso funzioni integrate del sistema operativo:

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

provare questo:

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

Operatore ternario sacro illeggibile, Batman! ;-P – deceze

25

sto usando questa funzione, che comprende diversi fallback per compensare le vecchie versioni di PHP o risultati semplicemente cattivi:

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; 
} 

Si tenta di utilizzare il più recenti funzioni PHP finfo. Se questi non sono disponibili, utilizza l'alternativa mime_content_type e include la sostituzione drop-in dalla libreria Upgrade.php per accertarsi che esista. Se quelli non restituiscono nulla di utile, proveranno il comando file del SO. AFAIK disponibile solo su sistemi * NIX, potresti volerlo modificare o eliminarlo se prevedi di usarlo su Windows. Se non funziona nulla, prova exif_imagetype come fallback solo per le immagini.

Sono venuto a notare che diversi server variano ampiamente nel loro supporto per le funzioni di tipo mime e che la sostituzione di Upgrade.php mime_content_type è lungi dall'essere perfetta. Le limitate funzioni exif_imagetype, sia quelle originali che quelle di Upgrade.php, funzionano comunque in modo abbastanza affidabile. Se sei solo preoccupato per le immagini, potresti voler usare solo quest'ultimo.

+0

Il fallback del comando 'file' è ridondante. L'estensione FileInfo (e la funzione mime_content_type) utilizzano lo stesso database di rilevamento file del comando 'file'. –

+0

@Sander Nei miei test ho trovato 'mime_content_type' per essere in qualche modo inaffidabile, o forse la sua sostituzione di upgrade.php è stata, mentre la chiamata' file' ha solitamente successo. Dovrò esaminarlo di più per vedere quando e perché fallisce in quali circostanze. Almeno non fa male essere lì. :) – deceze

+0

Ho dato una rapida occhiata al codice Upgrade.php per mime_content_type. Prima tenta l'estensione PECL FileInfo. Se questo non esiste, prova ad analizzare il file 'magic' da solo, in PHP. Problema: guarda solo in alcuni posti predefiniti per il file 'magic'. Ad esempio, fallisce sul mio Debian Squeeze. È anche possibile che il parser abbia bug, ma non l'ho controllato a fondo. –

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; 
} 

questo ha lavorato per me

Why is mime_content_type() deprecated in PHP?

0

Credo che ho trovato un breve senso. Prendi le dimensioni dell'immagine utilizzando:

$infFil=getimagesize($the_file_name);

e

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

Il getimagesize restituisce un array associativo che hanno un MIME chiave

ho usato e funziona

4

E ' molto facile averlo in php.

Chiamate la seguente funzione php 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() Speranza che aiuta qualcuno

0

Ho provato la maggior parte dei suggerimenti, ma tutti riescono per me (io sono inbetween ogni utile versione di PHP apparentemente.Ho finito con la seguente funzione:

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; 
}