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?
Antwort
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;
}
Ich denke, das ist eine alte Antwort. Jetzt sollten Sie 'fileinfo' http://www.php.net/manual/en/ref.fileinfo.php –
@ JorgeB.G verwenden. Das erfordert, dass die Datei existiert, oder? – danronmoon
@Danronmoon. ja tut es. – Qix
Wenn Sie eine Webservice verwenden wollen, habe ich gerade dies als Teil meiner MIME-Typ < -> Symbol Service
Zum Beispiel:
Es läuft auf appengine so sollte es hohe Verfügbarkeit haben.
-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'. –
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
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;
}
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. –
Hinweis: 'finfo_file()' und 'mime_content_type()' erfordert, dass die Datei existiert. – Pang
Wo heißt es, dass es veraltet ist? – Greg
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;
}
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.
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
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. –
@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