26 Stimmen

Wie ermittle ich die mit einem MIME-Typ verbundene(n) Erweiterung(en) in PHP?

Gibt es eine schnelle und schmutzige Zuordnung von MIME-Typen zu Erweiterungen in PHP, die ich nutzen kann?

0 Stimmen

Menschen, die lediglich eine Karte erstellen wollen Erweiterungen a MIME-Typen und nicht umgekehrt, sollten beachten, dass es jetzt eine eingebaute Unterstützung dafür gibt, die sie sich zunutze machen sollten - siehe Jorges Antwort und nicht die akzeptierte.

1 Stimmen

@MarkAmery Wie bereits erwähnt, setzt finfo_file() jedoch voraus, dass die Datei existiert. Das ist nicht immer der Fall. Die Antwort von Chaos ist immer noch zutreffender für den OP und auch 8 Jahre später noch gültig.

23voto

chaos Punkte 118918

Es ist nicht eingebaut, aber es ist nicht furchtbar schwer, etwas Eigenes zu entwickeln:

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 Stimmen

Ich glaube, dies ist eine alte Antwort. Jetzt sollten Sie verwenden fileinfo php.net/handbuch/de/ref.fileinfo.php

7 Stimmen

@JorgeB.G. Das setzt voraus, dass die Datei existiert, nicht wahr?

1 Stimmen

@danronmoon. Ja, das stimmt.

5voto

Jorge Barata Punkte 2145

Sie könnten verwenden mime_content_type aber sie ist veraltet. Verwenden Sie fileinfo stattdessen:

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

5 Stimmen

Es ist erwähnenswert, dass der OP eigentlich nach der Zuordnung von MIME-Typen fragte zu Dateierweiterungen. Dies deckt immer noch den häufigsten Anwendungsfall ab (und wahrscheinlich den, mit dem der OP konfrontiert war), daher verdient es sicherlich zu existieren, und ich habe es mit +1 versehen, aber es ist nicht streng genommen eine Antwort auf die Frage, die als pedantisch interpretiert wurde.

12 Stimmen

Anmerkung: finfo_file() y mime_content_type() setzt voraus, dass die Datei existiert.

7 Stimmen

Wo steht, dass sie veraltet ist?

4voto

Rob Punkte 4849

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

Beispiel für die Verwendung:

$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 die Qualität der bereitgestellten PHP-Funktionen offenbar zweifelhaft ist.

2voto

Foreever Punkte 6344

Wenn Sie mit einer begrenzten Anzahl von Bildern arbeiten und etwas sehr Einfaches benötigen, ist dies meiner Meinung nach ausreichend.

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

0voto

MSS Punkte 3168

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

wie dieses :

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

oder Inhalte kopieren:

$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 für den Abruf aus einem Stream:

 $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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X