Start · Sprachen · PHP · Referenz · exif_imagetype

exif_imagetype

Funktion

Liest den Bildtyp einer Datei anhand ihrer Magic-Bytes und gibt eine der <code>IMAGETYPE_*</code>-Konstanten zurück.

seit PHP 4.3.0 Kategorie: io

Signatur

exif_imagetype(string $filename): int|false

Beschreibung

exif_imagetype() liest die ersten Bytes einer Bilddatei und ermittelt daraus den Bildtyp. Die Funktion arbeitet dabei ausschließlich auf Basis der tatsächlichen Datei-Signatur (Magic Bytes), nicht anhand der Dateiendung. Das Ergebnis ist eine der vordefinierten IMAGETYPE_*-Konstanten, z. B. IMAGETYPE_JPEG, IMAGETYPE_PNG oder IMAGETYPE_GIF.

Die Funktion ist besonders nützlich, um hochgeladene Dateien serverseitig zu validieren, bevor sie weiterverarbeitet werden. Im Vergleich zu getimagesize() ist sie deutlich schneller, da sie nicht die vollständigen Bild-Metadaten einliest, sondern nur die ersten wenigen Bytes analysiert.

Der zurückgegebene Integer-Wert kann direkt mit den IMAGETYPE_*-Konstanten verglichen werden. Ergänzend lässt sich mit image_type_to_mime_type() der zugehörige MIME-Typ und mit image_type_to_extension() die passende Dateiendung ermitteln.

Wird kein gültiger Bildtyp erkannt oder die Datei kann nicht geöffnet werden, gibt die Funktion false zurück.

Parameter

Name Typ Default Beschreibung
$filename Pflicht string Pfad zur zu prüfenden Bilddatei (lokal oder als URL, sofern URL-Wrapper aktiviert sind).

Rückgabewert

Typ
int|false
Beschreibung
Gibt bei Erfolg eine der IMAGETYPE_*-Konstanten (z. B. IMAGETYPE_JPEG = 2) zurück. Wird kein gültiger Bildtyp erkannt oder die Datei kann nicht geöffnet werden, wird false zurückgegeben.

Beispiele

Bildtyp einer lokalen Datei prüfen

<?php
$file = '/var/www/uploads/foto.jpg';
$type = exif_imagetype($file);

if ($type === false) {
    echo 'Kein gültiges Bild oder Datei nicht lesbar.';
} else {
    echo 'Bildtyp-Konstante: ' . $type . PHP_EOL;
    echo 'MIME-Typ: ' . image_type_to_mime_type($type) . PHP_EOL;
    echo 'Erweiterung: ' . image_type_to_extension($type) . PHP_EOL;
}
Bildtyp-Konstante: 2 MIME-Typ: image/jpeg Erweiterung: .jpeg

Sicherer Datei-Upload mit Bildtyp-Validierung

<?php
$allowedTypes = [
    IMAGETYPE_JPEG,
    IMAGETYPE_PNG,
    IMAGETYPE_GIF,
    IMAGETYPE_WEBP,
];

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

    $detectedType = exif_imagetype($tmpPath);

    if ($detectedType === false || !in_array($detectedType, $allowedTypes, true)) {
        http_response_code(415);
        echo 'Ungültiger oder nicht unterstützter Bildtyp. Erlaubt: JPEG, PNG, GIF, WebP.';
        exit;
    }

    $extension = image_type_to_extension($detectedType, false); // ohne führenden Punkt
    $zielDatei = '/var/www/uploads/' . bin2hex(random_bytes(8)) . '.' . $extension;

    if (move_uploaded_file($tmpPath, $zielDatei)) {
        echo 'Bild erfolgreich gespeichert: ' . basename($zielDatei);
    } else {
        echo 'Fehler beim Speichern der Datei.';
    }
}

// Wichtig · Fallstricke

Sicherheitshinweis: Verlasse dich beim Validieren hochgeladener Dateien niemals allein auf den MIME-Typ aus $_FILES['bild']['type'], da dieser vom Client manipuliert werden kann. exif_imagetype() prüft die tatsächliche Datei-Signatur und ist daher deutlich zuverlässiger.

Performance: Für eine reine Typ-Erkennung ist exif_imagetype() vorzuziehen gegenüber getimagesize(), da letztere die gesamte Datei analysiert und deutlich mehr Ressourcen benötigt.

Erweiterung: Die Funktion gehört zur EXIF-Erweiterung. Stelle sicher, dass diese in deiner PHP-Installation aktiviert ist (extension=exif in der php.ini). Ab PHP 7.2 ist die Erweiterung standardmäßig aktiviert, muss aber dennoch explizit eingeschaltet werden.

Einschränkungen: Nicht alle Bildformate werden unterstützt. Exotische Formate wie AVIF werden erst ab bestimmten PHP-Versionen oder Erweiterungen erkannt. Für komplexe Formatanalysen empfiehlt sich der Einsatz der GD- oder Imagick-Bibliothek.