2010-07-22 2 views

Répondre

20

Les bits commencent par:

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

Les autres je ne sais pas en ce moment, mais le grand 3 (jpeg, gif, png) habituellement couvrir 99%. Donc, comparez les premiers octets à ces chaînes, et vous avez votre réponse.

+1

Pourriez-vous donner un exemple de la façon dont vous vérifieriez ces données par rapport à certaines données binaires en utilisant php? merci – DonutReply

+3

@DonutReply - juste pour les personnes qui le recherchent: https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 – CodeBrauer

+1

Avez-vous des informations sur les derniers bits pour trouver la fin d'une image? – Daniel

1

Les fichiers sont-ils téléchargés ou sont-ils déjà dans le système de fichiers? Utilisez le mime_content_type() pour obtenir le format MIME du fichier.

0

Pourquoi ne pas simplement vérifier l'entension de fichier? :)

Un

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

Absolument pas fiable. – Maerlyn

+0

Donc, la plupart de vos fichiers GIF ne sont pas réellement GIF? Il n'y a vraiment aucune raison que cela ne fonctionne pas, sauf si vous traitez des téléchargements d'utilisateurs, et même alors, vous n'avez probablement rien à craindre. – Dutchie432

+0

En 2012, certains utilisateurs pensent pouvoir convertir les images en renommant le fichier ... Ce n'est donc pas fiable. – djleop

6

est ici une implémentation de la fonction telle que décrite par Wrikken

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

Utilisez l'extension PHP fileinfo:

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

Son utilisant le "fichier" * commande nix pour déterminer de manière fiable le mime -type d'un fichier donné:

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

Cette extension est livrée avec PHP 5.3 ou peut être installée à partir de pecl (pecl install fileinfo) pour les versions antérieures.

25

Je peux voir que la plupart d'entre vous n'ont pas compris la question :) (la question était comment valider les données binaires dans le tampon, pas un fichier sur le disque).

J'ai eu même problème et résolu avec:

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

Cette solution est la meilleure, si vous utilisez PHP> 5.3 – djleop

+0

Cela devrait en effet être upvoted au-dessus de la mienne avec l'état actuel de PHP, 5.3 devient obsolète. – Wrikken

+0

Quel est le format de chaîne qu'il va retourner? –