2010-01-05 2 views

Antwort

23

Sie können Bilddateien mit getimagesize identifizieren.

Um mehr über MP3 und andere Audio/Video-Dateien finden Sie heraus, ich habe php-mp4info getID3() empfohlen.

+2

sagen Sie, dass ich überprüfen soll, ob eine Datei ein Bild ist oder nicht getimagesize mit so etwas wie: (! Getimagesize (Pfad)), wenn {print ‚! Diese Datei kein Bild ist‘;} ? getimagesize(); Gibt false zurück, wenn die Datei kein Bild ist? – kmunky

+1

+1 für diese Antwort ... die einzige Möglichkeit, sicher zu sein, dass ein Bild ein Bild ist, ist die Verwendung einer Bibliothek (in diesem Fall sind es Einsen für Bilder), die die Datei tatsächlich öffnet und analysiert, wie Sie es vorschlagen. Auf diese Weise verhindern Sie, dass jemand ein .XLS in .GIF umbenennt und hochlädt. – TravisO

+0

@kmunky: genau. Sehen Sie sich den manuellen Link an, um zu sehen, welche Bildtypen die Funktion erkennt. –

4

versuchen mime_content_type()

<?php 
echo mime_content_type('php.gif') . "\n"; 
echo mime_content_type('test.php'); 
?> 

Ausgang:

image/gif

text/plain

Oder eine bessere Nutzung finfo_file() andersrum ist veraltet.

+1

Ich bin neugierig, warum das einen Downvote bekommen hat? Es ist nur ab 5.3 – Gordon

+0

rechts veraltet, deshalb frage ich Sie – kmunky

+0

Seine Frage sagt ausdrücklich, überprüfen Sie den Dateityp neben nur Überprüfung der Dateierweiterung, die alle mime_content_type ist, es ist im Grunde ein eingebautes Array von Erweiterungen, es hat keine Idee, was die Datei wirklich ist. – TravisO

30

Einheimische Möglichkeiten, den MIME-Typ zu erhalten:

Für PHP < 5.3 Verwendung mime_content_type()
Für PHP> = 5.3 Verwendung finfo_fopen()

Alternativen die Mimetype sind exif_imagetype und getimagesize, aber diese verlassen, um zu bekommen die auf mit entsprechende libs installiert. Außerdem werden sie wahrscheinlich nur Bild-MIME-Typen zurückgeben, anstelle der gesamten Liste, die in magic.mime angegeben ist.

Wenn Sie sich nicht darum kümmern möchten, was auf Ihrem System verfügbar ist, wickeln Sie einfach alle vier Funktionen in eine Proxy-Methode ein, die den Funktionsaufruf an den verfügbaren Inhalt delegiert, z.

function getMimeType($filename) 
{ 
    $mimetype = false; 
    if(function_exists('finfo_fopen')) { 
     // open with FileInfo 
    } elseif(function_exists('getimagesize')) { 
     // open with GD 
    } elseif(function_exists('exif_imagetype')) { 
     // open with EXIF 
    } elseif(function_exists('mime_content_type')) { 
     $mimetype = mime_content_type($filename); 
    } 
    return $mimetype; 
} 
2

Sie finfo wie diese verwenden:

$mime = finfo_open(FILEINFO_MIME, $path_to_mime_magic_file); 
if ($mime ===FALSE) { 
    throw new Exception ('Finfo could not be run'); 
} 
$filetype = finfo_file($mime, $filename); 
finfo_close($mime); 

oder wenn Sie Probleme haben mit finfo nicht installiert ist, oder der Mime magic file funktioniert einfach nicht (es funktioniert auf 3 unserer 4 Server korrekt - alle identische Betriebssystem- und PHP-Installationen) - versuchen Sie dann, die native Linux-Datei zu verwenden (vergessen Sie nicht, den Dateinamen zu bereinigen: in diesem Beispiel le, ich weiß, der Dateiname vertraut werden kann, wie es in meinem Test-Code ein PHP temporärer Dateiname ist):

ob_start(); 
system('file -i -b '.$filename); 
$output = ob_get_clean(); 
$output = explode("; ", $output); 
if (is_array($output)) { 
    $filetype = trim($output[0]); 
} 

Dann geben Sie einfach den Mime Dateityp eine switch-Anweisung wie:

switch (strtolower($filetype)) { 
      case 'image/gif': 
       return '.gif'; 
       break; 
      case 'image/png': 
       return '.png'; 
       break; 
      case 'image/jpeg': 
       return '.jpg'; 
       break; 
      case 'audio/mpeg': 
       return '.mp3'; 
       break; 
} 
return null; 
6

zu finden der MIME-Typ einer Datei Ich benutze die folgende Wrapper-Funktion:

function Mime($path) 
{ 
    $result = false; 

    if (is_file($path) === true) 
    { 
     if (function_exists('finfo_open') === true) 
     { 
      $finfo = finfo_open(FILEINFO_MIME_TYPE); 

      if (is_resource($finfo) === true) 
      { 
       $result = finfo_file($finfo, $path); 
      } 

      finfo_close($finfo); 
     } 

     else if (function_exists('mime_content_type') === true) 
     { 
      $result = preg_replace('~^(.+);.*$~', '$1', mime_content_type($path)); 
     } 

     else if (function_exists('exif_imagetype') === true) 
     { 
      $result = image_type_to_mime_type(exif_imagetype($path)); 
     } 
    } 

    return $result; 
} 
3

getimeinfo ist am besten Bilder zu finden. Überprüfen Sie, ob der Rückgabetyp falsch ist.

1

Diese Funktion prüft, ob die Datei ein Bild auf Erweiterung und Pantomime und gibt true zurück, wenn es ein Browser kompatibel Bild ...

function checkImage($image) { 

//checks if the file is a browser compatible image 

$mimes = array('image/gif','image/jpeg','image/pjpeg','image/png'); 
//get mime type 
$mime = getimagesize($image); 
$mime = $mime['mime']; 

$extensions = array('jpg','png','gif','jpeg'); 
$extension = strtolower(pathinfo($image, PATHINFO_EXTENSION)); 

if (in_array($extension , $extensions) AND in_array($mime, $mimes)) return TRUE; 
else return FALSE; 

} 
+0

Danke! Das hat für mich funktioniert. – Harsha

0

Für Bilder basiert, die ich benutze:

function is_image($path) 
    { 
    $a = getimagesize($path); 
    $image_type = $a[2]; 

    if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP))) 
    { 
     return true; 
    } 
    return false; 
    } 
0

Der beste Weg ist die Funktion finfo_file. Beispiel:

<?php 
if (isset($_FILES['yourfilename']['tmp_name'])) { 
    $finfo = finfo_open(FILEINFO_MIME_TYPE); 
    $mime = finfo_file($finfo, $_FILES['yourfilename']['tmp_name']); 
    if ($mime == 'image/jpg') { 
     echo "It's an jpg image!"; 
    } 
    finfo_close($finfo); 
} 
?> 
Verwandte Themen