2009-07-18 9 views
23

Gibt es eine schnelle und schmutzige Zuordnung von MIME-Typen zu Erweiterungen in PHP, die ich verwenden kann?Wie ermittle ich die Erweiterung (en) eines MIME-Typs in PHP?

+0

Peo Wenn Sie * Erweiterungen * nur * MIME-Typen * zuordnen möchten, sollten Sie beachten, dass es jetzt eine integrierte Unterstützung dafür gibt, die sie nutzen sollten - siehe [Jorges Antwort] (http: // stackoverflow.com/a/20494035/1709587) statt der akzeptierten. –

+1

@MarkAmery aber wie bereits erwähnt, erfordert finfo_file(), dass die Datei existiert. Was nicht immer der Fall ist. Chaos 'Antwort ist immer noch auf dem OP und noch 8 Jahre später gültig. – Wranorn

Antwort

21

nicht eingebaut, aber es ist nicht sehr schwer, Ihre eigene Rolle:

function system_extension_mime_types() { 
    # Returns the system MIME type mapping of extensions to MIME types, as defined in /etc/mime.types. 
    $out = array(); 
    $file = fopen('/etc/mime.types', 'r'); 
    while(($line = fgets($file)) !== false) { 
     $line = trim(preg_replace('/#.*/', '', $line)); 
     if(!$line) 
      continue; 
     $parts = preg_split('/\s+/', $line); 
     if(count($parts) == 1) 
      continue; 
     $type = array_shift($parts); 
     foreach($parts as $part) 
      $out[$part] = $type; 
    } 
    fclose($file); 
    return $out; 
} 

function system_extension_mime_type($file) { 
    # Returns the system MIME type (as defined in /etc/mime.types) for the filename specified. 
    # 
    # $file - the filename to examine 
    static $types; 
    if(!isset($types)) 
     $types = system_extension_mime_types(); 
    $ext = pathinfo($file, PATHINFO_EXTENSION); 
    if(!$ext) 
     $ext = $file; 
    $ext = strtolower($ext); 
    return isset($types[$ext]) ? $types[$ext] : null; 
} 

function system_mime_type_extensions() { 
    # Returns the system MIME type mapping of MIME types to extensions, as defined in /etc/mime.types (considering the first 
    # extension listed to be canonical). 
    $out = array(); 
    $file = fopen('/etc/mime.types', 'r'); 
    while(($line = fgets($file)) !== false) { 
     $line = trim(preg_replace('/#.*/', '', $line)); 
     if(!$line) 
      continue; 
     $parts = preg_split('/\s+/', $line); 
     if(count($parts) == 1) 
      continue; 
     $type = array_shift($parts); 
     if(!isset($out[$type])) 
      $out[$type] = array_shift($parts); 
    } 
    fclose($file); 
    return $out; 
} 

function system_mime_type_extension($type) { 
    # Returns the canonical file extension for the MIME type specified, as defined in /etc/mime.types (considering the first 
    # extension listed to be canonical). 
    # 
    # $type - the MIME type 
    static $exts; 
    if(!isset($exts)) 
     $exts = system_mime_type_extensions(); 
    return isset($exts[$type]) ? $exts[$type] : null; 
} 
+5

Ich denke, das ist eine alte Antwort. Jetzt sollten Sie 'fileinfo' http://www.php.net/manual/en/ref.fileinfo.php –

+6

@ JorgeB.G verwenden. Das erfordert, dass die Datei existiert, oder? – danronmoon

+1

@Danronmoon. ja tut es. – Qix

2

Wenn Sie eine Webservice verwenden wollen, habe ich gerade dies als Teil meiner MIME-Typ < -> Symbol Service

http://stdicon.com/

Zum Beispiel:

http://stdicon.com/ext/html

Es läuft auf appengine so sollte es hohe Verfügbarkeit haben.

+1

-1; Es ist nicht nötig, einen Webdienst zu verwenden, wenn dieser lokal erreicht werden kann, es erlaubt keine Zuordnung von MIME-Typen * zu * Erweiterungen (was das OP verlangt), und der Web-Service, wie er aktuell ist, hat keine eigenen Erweiterungen 'mime.types' Datei auf einer gewöhnlichen Ubuntu-Installation versteht, wie' .woff'. –

+0

Navigieren zu http://stdicon.com generiert einen Fehler für mich. Link zu Pastebin: http://pastebin.com/BjkGRv7H. Es ist erwähnenswert, dass der Dienst selbst in Ordnung ist. – starbeamrainbowlabs

6

Sie könnten mime_content_type verwenden, aber es ist veraltet. Verwenden Sie fileinfo statt:

function getMimeType($filename) { 
    $finfo = finfo_open(FILEINFO_MIME_TYPE); 
    $mime = finfo_file($finfo, $filename); 
    finfo_close($finfo); 
    return $mime; 
} 
+4

Es ist erwähnenswert, dass das OP tatsächlich aufgefordert hat, MIME-Typen * zu * Dateierweiterungen zuzuordnen. Dies deckt immer noch den häufigsten Anwendungsfall ab (und wahrscheinlich den, mit dem das OP konfrontiert war), also verdient es es zu existieren, und ich habe es getan, aber es ist * nicht * streng eine Antwort auf die Frage, die pedantisch gestellt wurde interpretiert. –

+8

Hinweis: 'finfo_file()' und 'mime_content_type()' erfordert, dass die Datei existiert. – Pang

+2

Wo heißt es, dass es veraltet ist? – Greg

2

Wenn Sie arbeiten mit variieren begrenzt Erweiterungen von Bildern und brauchen etwas sehr einfach, ich denke, das ist genug.

switch($info['mime']) 
    { 
    case 'image/gif' : $extension = 'gif'; break; 
    case 'image/png' : $extension = 'png'; break; 
    case 'image/jpeg' : $extension = 'jpg'; break; 

    default : 
     throw new ApplicationException('The file uploaded was not a valid image file.'); 
    break; 
    } 
2

Vielleicht möchten Sie diese Bibliothek verwenden: https://github.com/ralouphie/mimey

Beispiel Nutzung:

$mimes = new \Mimey\MimeTypes; 

// Convert extension to MIME type: 
$mimes->getMimeType('json'); // application/json 

// Convert MIME type to extension: 
$mimes->getExtension('application/json'); // json 

Dies, weil offenbar die Qualität der bereitgestellten PHP-Funktionen fragwürdig ist.

0

verwenden diese Datei: https://github.com/ralouphie/mimey/blob/develop/mime.types.php

wie folgt aus:

$mimes=include('mime.types.php'); 

oder Kopieren von Inhalten:

$mime= array (
    'mimes' => 
    array (
    'ez' => 
    array (
     0 => 'application/andrew-inset', 
    ), 
    'aw' => 
    array (
     0 => 'application/applixware', 
    ), 
    'atom' => 
    array (
     0 => 'application/atom+xml', 
    ), 
    'atomcat' => 
    array (
     0 => 'application/atomcat+xml', 
    ) 

    ... 

und ein Beispiel aus einem Strom erhalten:

$finfo = new \finfo(FILEINFO_MIME_TYPE); 
$mime=$finfo->buffer($data); 
$mimes=include(__DIR__."/mime.types.php"); 
echo ($mime); //mime 
echo ($mimes['extensions'][$mime]); // file extension