Start · Sprachen · PHP · Referenz · mime_content_type

mime_content_type

Funktion

Ermittelt den MIME-Typ einer Datei anhand ihres Inhalts (Magic-Bytes) und gibt ihn als String zurück.

seit PHP 5.0.0 Kategorie: io

Signatur

mime_content_type(string $filename): string|false

Beschreibung

mime_content_type() analysiert den Inhalt einer Datei und gibt den entsprechenden MIME-Typ zurück, z. B. image/jpeg, application/pdf oder text/plain. Die Erkennung basiert auf den sogenannten Magic-Bytes – charakteristischen Byte-Mustern am Anfang einer Datei – und ist damit deutlich zuverlässiger als eine reine Erkennung anhand der Dateiendung.

Die Funktion eignet sich besonders beim Verarbeiten von Datei-Uploads oder beim Ausliefern von Dateien über PHP, wenn der korrekte Content-Type-Header gesetzt werden muss. Da sie auf der libmagic-Bibliothek basiert, muss diese auf dem Server verfügbar sein.

Als Parameter akzeptiert die Funktion sowohl einen Dateipfad auf dem lokalen Dateisystem als auch einen Stream-Wrapper-Pfad. Seit PHP 5.3 ist die Funktion Teil des PHP-Kerns; zuvor war sie über die PECL-Erweiterung fileinfo oder die veraltete mime_magic-Erweiterung verfügbar.

Für komplexere Anforderungen – z. B. wenn zusätzliche MIME-Informationen wie Zeichensatz oder Encoding benötigt werden – empfiehlt sich die Verwendung der finfo-Klasse (finfo_file()), die eine feingranularere Steuerung ermöglicht.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur Datei, deren MIME-Typ ermittelt werden soll. Kann ein lokaler Dateipfad oder ein Stream-Wrapper-Pfad sein.

Rückgabewert

Typ
string|false
Beschreibung
Gibt den MIME-Typ der Datei als String zurück (z. B. image/png). Bei einem Fehler – etwa wenn die Datei nicht existiert oder nicht gelesen werden kann – wird false zurückgegeben.

Beispiele

MIME-Typ einer Bilddatei ermitteln

<?php
$datei = '/var/www/html/uploads/foto.jpg';

$mimeTyp = mime_content_type($datei);

if ($mimeTyp !== false) {
    echo "MIME-Typ: " . $mimeTyp;
} else {
    echo "Fehler: Datei nicht gefunden oder nicht lesbar.";
}
MIME-Typ: image/jpeg

Datei-Upload mit MIME-Typ-Prüfung absichern

<?php
// Erlaubte MIME-Typen für Bild-Uploads
$erlaubteTypen = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['bild'])) {
    $tmpPfad = $_FILES['bild']['tmp_name'];

    // MIME-Typ anhand des Inhalts prüfen – NICHT anhand von $_FILES['bild']['type']
    $mimeTyp = mime_content_type($tmpPfad);

    if ($mimeTyp === false) {
        echo 'Fehler: Datei konnte nicht analysiert werden.';
    } elseif (!in_array($mimeTyp, $erlaubteTypen, true)) {
        echo 'Unzulässiger Dateityp: ' . htmlspecialchars($mimeTyp);
    } else {
        $zielPfad = '/var/www/html/uploads/' . basename($_FILES['bild']['name']);
        move_uploaded_file($tmpPfad, $zielPfad);
        echo 'Upload erfolgreich. MIME-Typ: ' . htmlspecialchars($mimeTyp);
    }
}

Datei mit korrektem Content-Type-Header ausliefern

<?php
$datei = '/var/www/html/downloads/bericht.pdf';

if (!file_exists($datei)) {
    http_response_code(404);
    exit('Datei nicht gefunden.');
}

$mimeTyp = mime_content_type($datei);

header('Content-Type: ' . ($mimeTyp ?: 'application/octet-stream'));
header('Content-Length: ' . filesize($datei));
header('Content-Disposition: attachment; filename="' . basename($datei) . '"');

readfile($datei);

// Wichtig · Fallstricke

Sicherheitshinweis: Verlasse dich beim Verarbeiten von Datei-Uploads niemals auf $_FILES['datei']['type'], da dieser Wert vom Client gesendet und damit manipuliert werden kann. Verwende stattdessen mime_content_type() oder besser noch finfo_file(), um den MIME-Typ serverseitig anhand des tatsächlichen Dateiinhalts zu prüfen.

Einschränkungen: Die Erkennung ist nicht unfehlbar. Textdateien werden häufig als text/plain erkannt, auch wenn sie z. B. CSV oder HTML enthalten. Für differenziertere Ergebnisse empfiehlt sich finfo_file() mit dem Flag FILEINFO_MIME_TYPE.

Abhängigkeit: Die Funktion setzt die libmagic-Bibliothek voraus. Auf manchen minimalen Serverinstallationen könnte diese fehlen, weshalb die Verfügbarkeit vorab mit function_exists('mime_content_type') geprüft werden sollte.