it-swarm.com.de

Wie finde ich den MIME-Typ einer Datei mit PHP?

Ok, also ich habe eine index.php-Datei, die viele verschiedene Dateitypen verarbeiten muss. Wie errate ich den Dateityp basierend auf dem REQUEST_URI.

Wenn ich nach http://site/image.jpg Frage und alle Anfragen über index.php umleiten, sieht das so aus

<?php
   include('/www/site'.$_SERVER['REQUEST_URI']);
?>

Wie würde ich das richtig machen?

Sollte ich anhand der Erweiterung der angeforderten Datei testen, oder gibt es eine Möglichkeit, den Dateityp zu ermitteln?

48
Issac Kelly

Wenn Sie sicher sind, dass Sie immer nur mit Bildern arbeiten, können Sie sich das ansehen getimagesize () exif_imagetype () PHP Funktion, die versucht, den MIME-Typ des Bildes zurückzugeben.

Wenn Ihnen externe Abhängigkeiten nichts ausmachen, können Sie auch die ausgezeichnete Bibliothek getID prüfen, die den MIME-Typ vieler verschiedener Dateitypen bestimmen kann.

Zuletzt können Sie die Funktion mime_content_type () auschecken, die jedoch für die PECL-Erweiterung Fileinfo veraltet ist.

49
leek

da mime_content_type () veraltet ist, können Sie sich in Zukunft nicht mehr darauf verlassen, dass es funktioniert. Es gibt eine "fileinfo" -PECL-Erweiterung, aber ich habe noch nichts Gutes darüber gehört.

Wenn Sie auf einem * nix-Server arbeiten, können Sie Folgendes tun, was für mich gut funktioniert hat:

$file = escapeshellarg( $filename );
$mime = Shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
22
Eric_WVGG
function get_mime($file) {
  if (function_exists("finfo_file")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $mime;
  } else if (function_exists("mime_content_type")) {
    return mime_content_type($file);
  } else if (!stristr(ini_get("disable_functions"), "Shell_exec")) {
    // http://stackoverflow.com/a/134930/1593459
    $file = escapeshellarg($file);
    $mime = Shell_exec("file -bi " . $file);
    return $mime;
  } else {
    return false;
  }
}

Für mich funktioniert nichts davon - mime_content_type ist veraltet, finfo ist nicht installiert und Shell_exec ist nicht erlaubt.

18
Ale

Eigentlich hatte ich genug von dem Mangel an Standard MIME-Sniffing-Methoden in PHP. Installiere fileinfo ... Benutze veraltete Funktionen ... Oh diese funktionieren, aber nur für Bilder! Ich habe es satt, also habe ich ein paar Nachforschungen angestellt und die WHATWG Mimesniffing spec - Ich glaube jedoch, dass dies immer noch eine Entwurfsspezifikation ist.

Jedenfalls konnte ich mit dieser Spezifikation einen Mimesniffer in PHP implementieren. Leistung ist kein Problem. Tatsächlich konnte ich auf meiner bescheidenen Maschine Tausende von Dateien öffnen und riechen, bevor PHP abgelaufen war.

Hier ist die MimeReader-Klasse .

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.
10
Shane

Wenn Sie nur mit Bildern arbeiten und MIME-Typ benötigen (z. B. für Überschriften), ist dies die schnellste und direkteste Antwort:

$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));

Es wird ein MIME-Typ ausgegeben, selbst wenn Sie Ihre Bilddatei umbenennen

8
Andrew

Sie können finfo verwenden, um dies ab PHP 5.3 zu erreichen:

<?php
$info = new finfo(FILEINFO_MIME_TYPE);
echo $info->file('myImage.jpg');
// prints "image/jpeg"

Das FILEINFO_MIME_TYPE-Flag ist optional. Andernfalls erhalten Sie eine ausführlichere Zeichenfolge für einige Dateien. (Anscheinend geben einige Bildtypen Informationen zu Größe und Farbtiefe zurück.) Die Verwendung des FILEINFO_MIME-Flags gibt den MIME-Typ und die Codierung zurück, falls verfügbar (z. B. image/png; Zeichensatz = binär oder Text/x-php; Zeichensatz = us-ascii). Siehe diese Seite für weitere Informationen.

1
jhaagsma

mime_content_type() scheint der richtige Weg zu sein, auch wenn die obigen Kommentare besagen, dass es veraltet ist. Es ist nicht - oder zumindest ist diese Inkarnation von mime_content_type() nicht veraltet, gemäß http://php.net/manual/en/function.mime-content-type.php . Es ist Teil der FileInfo-Erweiterung, aber in der PHP Dokumentation heißt es jetzt, dass es ab PHP= 5.3.0 standardmäßig aktiviert ist.

1
David

Laut PHP-Handbuch ist die Funktion finfo-file der beste Weg, dies zu tun. Sie müssen jedoch die PECL-Erweiterung FileInfo installieren.

Wenn die Erweiterung keine Option ist, können Sie die veraltete Funktion mime_content_type verwenden.

1
Devon

wenn Sie sich nur mit Bildern beschäftigen, können Sie die Funktion [getimagesize()][1] verwenden, die alle Arten von Informationen über das Bild enthält, einschließlich des Typs.

Ein allgemeinerer Ansatz wäre die Verwendung der FileInfo-Erweiterung von PECL. Die PHP Dokumentation für diese Erweiterung finden Sie unter: http://us.php.net/manual/en/ref.fileinfo.php

Einige Leute haben ernsthafte Beschwerden über diese Erweiterung. Wenn Sie also auf ernsthafte Probleme stoßen oder die Erweiterung aus irgendeinem Grund nicht installieren können, sollten Sie die veraltete Funktion mime_content_type() überprüfen

0
phatduckk

Hiermit können Sie die Mime aller Dateien auf Ihrem Server abrufen

<?php
function get_mime($file_path){
  $finfo = new finfo(FILEINFO_MIME_TYPE);
  $type  = $finfo->file(file_path);
}

$mime = get_mime('path/to/file.ext');
0
Joshua

ich habe sehr gute Ergebnisse mit einer User-Funktion von http://php.net/manual/de/function.mime-content-type.php Okt-2009 03:43 ''

function get_mime_type($filename, $mimePath = '../etc') { ...

die keine finfo, exec oder veraltete Funktion verwendet

funktioniert auch mit entfernten ressourcen!

0
vizzy

Wenn Sie Linux ausführen und die Erweiterung haben, können Sie einfach den MIME-Typ aus /etc/mime.types lesen, indem Sie ein Hash-Array erstellen. Sie können das dann im Speicher ablegen und das MIME einfach über die Array-Taste aufrufen :)

/**
 * Helper function to extract all mime types from the default Linux /etc/mime.types
 */
function get_mime_types() {
    $mime_types = array();
    if (
        file_exists('/etc/mime.types') &&
        ($fh = fopen('/etc/mime.types', 'r')) !== false
    ) {
        while (($line = fgets($fh)) !== false) {
            if (!trim($line) || substr($line, 0, 1) === '#') continue;
            $mime_type = preg_split('/\t+/', rtrim($line));
            if (
                is_array($mime_type) &&
                isset($mime_type[0]) && $mime_type[0] &&
                isset($mime_type[1]) && $mime_type[1]
            ) {
                foreach (explode(' ', $mime_type[1]) as $ext) {
                    $mime_types[$ext] = $mime_type[0];
                }
            }
        }
        fclose($fh);
    }
    return $mime_types;
}
0
techouse

Ich habe es nicht verwendet, aber es gibt eine PECL-Erweiterung zum Abrufen des Mimetyps einer Datei. Die offizielle Dokumentation dafür ist in das Handbuch .

Abhängig von Ihren Zwecken kann eine Dateierweiterung in Ordnung sein, sie ist jedoch nicht besonders zuverlässig, da sie so einfach geändert werden kann.

0
enobrev