2010-07-22 4 views

Respuesta

20

los bits de inicio con:

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

Los otros no sabría en este momento, pero los 3 grandes (jpeg, gif, png) por lo general cubrir el 99%. Entonces, compare los primeros bytes con esas cadenas, y tiene su respuesta.

+1

¿Podría dar un ejemplo de cómo los compararía con algunos datos binarios usando php? gracias – DonutReply

+3

@DonutReply - solo para las personas que lo buscan: https://gist.github.com/CodeBrauer/5fe9ad14fa9786b3d1f6 – CodeBrauer

+1

¿Tiene alguna información sobre los últimos bits para encontrar el final de una imagen? – Daniel

1

¿Se están cargando los archivos o ya están en el sistema de archivos?

Pruebe usar mime_content_type() para obtener el formato MIME del archivo.

0

¿Por qué no comprueba la entensión del archivo? :)

una alternativa

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

absolutamente fiable. – Maerlyn

+0

¿Entonces la mayoría de sus archivos GIF no son realmente GIF? Realmente no hay razón para que esto no funcione a menos que esté lidiando con cargas de usuarios, e incluso entonces probablemente no tenga nada de qué preocuparse. – Dutchie432

+0

En 2012, algunos usuarios creen que pueden convertir imágenes simplemente cambiando el nombre del archivo ... Por lo tanto, no es confiable. – djleop

6

Aquí es una implementación de la función como se describe por 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

Utilice la extensión fileinfo PHP:

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

Su usando el "archivo" * comando nix determinar con fiabilidad el mimo -tipo de un archivo dado:

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

Esta extensión se envía con PHP 5.3 o se puede instalar desde pecl (pecl install fileinfo) para versiones anteriores.

25

Veo que la mayoría de ustedes no entendieron la pregunta :) (la pregunta era cómo validar los datos binarios en el búfer, no un archivo en el disco).

que tenía el mismo problema, y ​​resuelto con:

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

Esta solución es la mejor, si está usando PHP> 5.3 – djleop

+0

Esto debería de hecho ser votado por encima del mío con el estado actual de PHP, 5.3 está envejeciendo. – Wrikken

+0

¿Cuál es el formato de cadena que devolverá? –

Cuestiones relacionadas