Start · Sprachen · PHP · Referenz · finfo_open

finfo_open

Funktion

Erstellt eine neue <code>finfo</code>-Instanz zur Erkennung von MIME-Typen und weiteren Dateiinformationen anhand der Magic-Datenbank.

seit PHP 5.3.0 Kategorie: io

Signatur

finfo_open(int $flags = FILEINFO_NONE, ?string $magic_database = null): finfo|false

Beschreibung

finfo_open() initialisiert eine neue Fileinfo-Ressource (bzw. ab PHP 8.1 ein finfo-Objekt), die anschließend mit finfo_file() oder finfo_buffer() genutzt werden kann, um Informationen über Dateien oder Rohdaten zu ermitteln – typischerweise den MIME-Typ einer Datei.

Der Parameter $flags steuert, welche Art von Information zurückgegeben werden soll. Die am häufigsten verwendeten Flags sind FILEINFO_NONE (Standardverhalten) und FILEINFO_MIME_TYPE (gibt nur den MIME-Typ zurück, z. B. image/jpeg). Mehrere Flags lassen sich mit dem bitweisen OR-Operator (|) kombinieren.

Über den optionalen Parameter $magic_database kann ein Pfad zu einer eigenen Magic-Datenbank angegeben werden. Wird null übergeben oder der Parameter weggelassen, verwendet PHP die eingebaute Datenbank, was in den meisten Fällen ausreicht.

Nach der Verwendung sollte die Ressource mit finfo_close() freigegeben werden, um Speicher zu sparen – bei der objektorientierten Variante übernimmt der Destruktor diese Aufgabe automatisch.

Parameter

Name Typ Default Beschreibung
$flags int FILEINFO_NONE Eine oder mehrere FILEINFO_*-Konstanten, die per | kombiniert werden können. Typische Werte: FILEINFO_NONE, FILEINFO_MIME_TYPE, FILEINFO_MIME_ENCODING, FILEINFO_MIME.
$magic_database ?string null Pfad zu einer alternativen Magic-Datenbank-Datei. Bei null wird die in PHP eingebaute Datenbank verwendet.

Rückgabewert

Typ
finfo|false
Beschreibung
Gibt bei Erfolg eine finfo-Instanz zurück. Bei einem Fehler (z. B. ungültige Datenbank) wird false zurückgegeben.

Beispiele

MIME-Typ einer Datei ermitteln

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);

if ($finfo === false) {
    die('Fehler beim Öffnen der Fileinfo-Ressource.');
}

$datei = '/var/www/uploads/bild.jpg';
$mimeType = finfo_file($finfo, $datei);

echo 'MIME-Typ: ' . $mimeType . PHP_EOL;

finfo_close($finfo);
MIME-Typ: image/jpeg

Objektorientierte Verwendung zur Upload-Validierung

<?php
// Objektorientierte Variante (finfo als Klasse)
$finfo = new finfo(FILEINFO_MIME_TYPE);

$erlaubteMimeTypes = ['image/jpeg', 'image/png', 'image/gif'];

foreach ($_FILES['uploads']['tmp_name'] as $tmpName) {
    $mimeType = $finfo->file($tmpName);

    if (!in_array($mimeType, $erlaubteMimeTypes, true)) {
        echo 'Datei abgelehnt: Ungültiger MIME-Typ (' . htmlspecialchars($mimeType) . ')' . PHP_EOL;
    } else {
        echo 'Datei akzeptiert: ' . htmlspecialchars($mimeType) . PHP_EOL;
    }
}
// Destruktor schließt die Ressource automatisch

MIME-Typ und Zeichenkodierung kombinieren

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE | FILEINFO_MIME_ENCODING);

$datei = '/tmp/dokument.txt';
$info = finfo_file($finfo, $datei);

echo $info . PHP_EOL;

finfo_close($finfo);
text/plain; charset=utf-8

// Wichtig · Fallstricke

Sicherheitshinweis: Verlasse dich bei der Validierung von Datei-Uploads niemals allein auf die Dateiendung oder den vom Client gemeldeten Content-Type. Nutze stattdessen finfo_open() mit FILEINFO_MIME_TYPE, da diese Funktion den tatsächlichen Dateiinhalt analysiert (Magic Bytes).

Beachte, dass finfo_open() die PECL-Erweiterung fileinfo benötigt, die ab PHP 5.3 fest eingebaut ist. Unter älteren Systemen muss sie ggf. separat installiert werden.

Ab PHP 8.1 ist die zugrunde liegende Ressource ein echtes finfo-Objekt; der prozedurale Stil mit finfo_open() und finfo_close() bleibt aber weiterhin verfügbar.