2010-07-22 3 views

Antwort

20

Die Bits beginnen mit:

$JPEG = "\xFF\xD8\xFF" 
$GIF = "GIF" 
$PNG = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" 
$BMP = "BM" 
$PSD = "8BPS" 
$SWF = "FWS" 

die andere würde ich jetzt nicht weiß, aber der großen 3 (JPEG, GIF, PNG) in der Regel Abdeckung 99%. Vergleiche also die ersten Bytes mit diesen Strings und du hast deine Antwort.

+1

Könnten Sie ein Beispiel geben, wie Sie diese gegen einige Binärdaten mit PHP überprüfen würden? Danke – DonutReply

+3

@DonutReply - nur für die Leute, die es suchen: https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 – CodeBrauer

+1

Haben Sie irgendwelche Informationen über die letzten Bits, um das Ende eines Bildes herauszufinden? – Daniel

1

Werden die Dateien hochgeladen oder befinden sie sich bereits im Dateisystem?

Verwenden Sie mime_content_type(), um das MIME-Format der Datei zu erhalten.

0

Warum nicht einfach die Dateieinleitung überprüfen? :)

Eine Alternative

if(exif_imagetype($filepath) == IMAGETYPE_JPEG){ 
    echo 'This is a JPEG image'; 
} 
+7

Absolut unzuverlässig. – Maerlyn

+0

Also die meisten Ihrer GIF-Dateien sind nicht wirklich GIFs? Es gibt wirklich keinen Grund, das würde nicht funktionieren, wenn Sie mit User-Uploads zu tun haben, und selbst dann haben Sie wahrscheinlich nichts zu befürchten. – Dutchie432

+0

Im Jahr 2012 glauben einige Benutzer, dass sie Bilder nur durch Umbenennen der Datei konvertieren können ... Also, es ist nicht zuverlässig. – djleop

6

Hier ist eine Implementierung der Funktion als

von Wrikken beschrieben
function getImgType($filename) { 
    $handle = @fopen($filename, 'r'); 
    if (!$handle) 
     throw new Exception('File Open Error'); 

    $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' => 'GIF', 'png' => "\x89\x50\x4e\x47\x0d\x0a", 'bmp' => 'BM', 'psd' => '8BPS', 'swf' => 'FWS'); 
    $bytes = fgets($handle, 8); 
    $found = 'other'; 

    foreach ($types as $type => $header) { 
     if (strpos($bytes, $header) === 0) { 
      $found = $type; 
      break; 
     } 
    } 
    fclose($handle); 
    return $found; 
} 
0

Verwenden Sie die Fileinfo-PHP-Erweiterung:

http://de.php.net/manual/en/function.finfo-file.php

Seine "Datei" * nix-Befehl den Mime zuverlässig bestimmen mit Typ einer gegebenen Datei:

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mimetype = finfo_file($finfo, $filename); 
finfo_close($finfo); 

Diese Erweiterung wird mit PHP 5.3 geliefert oder kann von pecl (pecl install fileinfo) für frühere Versionen installiert werden.

25

Ich kann sehen, dass die meisten von Ihnen die Frage nicht verstanden :) (Frage war, wie binäre Daten im Puffer zu validieren, nicht eine Datei auf der Festplatte).

hatte ich gleiches Problem und es gelöst mit:

$finfo = new finfo(FILEINFO_MIME_TYPE); 
$finfo->buffer($rawImage); 
+1

Diese Lösung ist die beste, wenn Sie PHP> 5.3 verwenden. – djleop

+0

Dies sollte in der Tat über meine mit dem aktuellen Stand von PHP upvoted werden, 5.3 wird alt. – Wrikken

+0

Was ist das String-Format, das es zurückgibt? –

Verwandte Themen