Signatur
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
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.";
}
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.