2009-07-18 5 views
23

Esiste una mappatura rapida e sporca dei tipi MIME alle estensioni in PHP che posso utilizzare?Come si determinano le estensioni associate a un tipo MIME in PHP?

+0

Peo volendo semplicemente mappare * estensioni * a * tipi MIME *, piuttosto che il contrario, si dovrebbe notare che ora c'è un supporto integrato per questo da cui dovrebbero trarre vantaggio - vedi [risposta di Jorge] (http: // stackoverflow.com/a/20494035/1709587) piuttosto che accettato. –

+1

@MarkAmery tuttavia come indicato, finfo_file() richiede che il file esista. Quale non è sempre il caso. La risposta del caos è ancora più pertinente al PO e ancora valida 8 anni dopo. – Wranorn

risposta

21

Non built-in, ma non è terribilmente difficile da rotolare il proprio:

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

Penso che questa sia una vecchia risposta. Ora dovresti usare 'fileinfo' http://www.php.net/manual/en/ref.fileinfo.php –

+6

@ JorgeB.G. Ciò richiede che il file esista, non è vero? – danronmoon

+1

@danronmoon. si lo fa – Qix

2

Se si desidera utilizzare un webservice, Ho appena creato questa come parte del mio tipo MIME < -> Servizio icona

http://stdicon.com/

Ad esempio:

http://stdicon.com/ext/html

Funziona su Appengine quindi dovrebbe avere alta disponibilità.

+1

-1; non è necessario utilizzare un servizio Web per questo quando può essere realizzato localmente, non consente il mapping di tipi MIME * a * estensioni (cosa richiesto dall'OP), e il servizio web così com'è attualmente manca estensioni che il mio locale Il file 'mime.types' su una normale installazione di Ubuntu comprende, come' .woff'. –

+0

Navigare su http://stdicon.com genera un errore per me. Link a pastebin: http://pastebin.com/BjkGRv7H. Vale la pena notare che il servizio stesso funziona bene però. – starbeamrainbowlabs

6

Si potrebbe utilizzare mime_content_type ma è deprecato. Utilizzare fileinfo invece:

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

Vale la pena notare che l'OP ha effettivamente chiesto di associare i tipi MIME * alle * estensioni di file. Questo copre ancora il caso d'uso più comune (e probabilmente quello con il quale l'OP si trovava di fronte), quindi sicuramente merita di esistere e l'ho + 1ed, ma non è * rigorosamente * una risposta alla domanda che è stata posta come pedante interpretato. –

+8

Nota: 'finfo_file()' e 'mime_content_type()' richiede che il file esista. – Pang

+2

Dove dice che è deprecato? – Greg

2

Se si lavora con vari estensioni limitate di immagini e hanno bisogno di qualcosa di molto semplice, credo che questo sia sufficiente.

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

Si potrebbe desiderare di utilizzare questa libreria: utilizzo https://github.com/ralouphie/mimey

Esempio:

$mimes = new \Mimey\MimeTypes; 

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

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

Questo perché a quanto pare la qualità delle funzioni PHP di cui è dubbia.

0

usano questo file: https://github.com/ralouphie/mimey/blob/develop/mime.types.php

come questo:

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

o copiare il contenuto:

$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', 
    ) 

    ... 

e un esempio di ottenere da un flusso:

$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 
Problemi correlati