2010-01-05 20 views

Respuesta

23

Puede identificar los archivos de imagen usando getimagesize.

Para saber más acerca de otros archivos de audio/vídeo y MP3, se me ha recomendado php-mp4info getID3().

+2

estás diciendo que yo debería comprobar si un archivo es una imagen o no usar getimagesize algo como: (! Getimagesize (camino)) si {print '! Este archivo no es una imagen';} ? getimagesize(); devuelve falso si el archivo no es una imagen? – kmunky

+1

+1 para esta respuesta ... la única manera de asegurarse de que una imagen sea una imagen es usar una biblioteca (en este caso, hay incorporadas para las imágenes) que realmente abre el archivo y lo analiza como usted sugiere. De esta forma evitará que alguien cambie el nombre de un .XLS a .GIF y lo cargue. – TravisO

+0

@kmunky: exactamente. Consulte el enlace del manual para ver qué tipos de imágenes reconoce la función. –

4

tratar mime_content_type()

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

Salida:

imagen

/gif

text/plain

O mejor uso finfo_file() la otra forma es obsoleta.

+1

Tengo curiosidad por qué esto tiene un voto negativo? Está desaprobado a partir de 5.3 – Gordon

+0

, es por eso que te pregunto – kmunky

+0

Su pregunta específicamente dice que revises el tipo de archivo además de simplemente verificar la extensión del archivo, que es todo lo que mime_content_type hace, básicamente es una serie integrada de extensiones, no tiene idea de qué es realmente el archivo. – TravisO

30

formas nativas para obtener el tipo MIME:

Para PHP < 5.3 uso mime_content_type()
Para PHP> = 5.3 uso finfo_fopen()

Alternativas para obtener el tipo MIME son exif_imagetype y getimagesize, pero estos se basan en tener el bibliotecas apropiadas instaladas. Además, es probable que solo devuelvan tipos de imagen de mimet, en lugar de la lista completa dada en magic.mime.

Si no desea preocuparse por lo que está disponible en su sistema, simplemente ajuste las cuatro funciones en un método proxy que delegue la llamada de función a lo que esté disponible, p. Ej.

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

usted podría utilizar finfo así:

$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); 

o si tiene problemas con finfo no está instalado, o el archivo de la magia mimo simplemente no funciona (funciona correctamente en 3 de nuestros 4 servidores - todas idénticas instalaciones de SO y PHP) - luego intente usar el archivo nativo de Linux (no se olvide de desinfectar el nombre del archivo): en este ejemplo Le, sé el nombre del archivo se puede confiar ya que es un nombre de archivo temporal PHP en mi código de prueba):

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

Entonces sólo tiene que pasar el tipo de archivo MIME para una sentencia switch como:

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

Para encontrar el tipo MIME de un archivo que utilizo la siguiente función de contenedor:

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

getimageinfo es mejor para encontrar imágenes. Verifica si el tipo de devolución es falso.

1

Esta función comprueba si el archivo es una imagen basada en la extensión y la mímica y devuelve verdadero si se trata de una imagen compatible con el navegador ...

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

Gracias! esto funcionó para mí. – Harsha

0

para las imágenes, utilizo:

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

La mejor manera es usar la función finfo_file. Ejemplo:

<?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); 
} 
?> 
Cuestiones relacionadas