2008-10-09 18 views
16

Estoy buscando una manera de tomar una imagen cargada por el usuario que actualmente se coloca en una ubicación temporal ex:/tmp/jkhjkh78 y crear una imagen php de ella, detectando automáticamente el formato.Detección automática de formato de imagen en PHP

¿Hay una forma más inteligente de hacer esto que un montón de probar/capturar con imagefromjpeg, imagefrompng, etc.?

Respuesta

0

puede llamar a un comando del sistema (si eres menor de Linux/Unix), file si te gusta:

[email protected]:~$ file a 
a: JPEG image data, EXIF standard 2.2 
25

Esta es una de las funciones de getimagesize. Probablemente deberían haberlo llamado "getimageinfo", pero eso es PHP para ti.

0

Esto le ayudará a conocer la extensión y el resultado según la condición

$ image_file = 'http://foo.com/images.gif';
$ extension = substr ($ image_file, -4);
if ($ extension == ".jpg") {echo 'Es una imagen JPG.'; } else {echo 'No es una imagen JPG.'; }

+0

En primer lugar, no hay ningún control para las extensiones jpeg, jpe, jif y jfif. Aunque poco comunes, todavía son utilizados por algunas personas (en su mayoría jpeg). Además, la extensión no refleja necesariamente el formato de la imagen y cargar un archivo PHP con la extensión JPG podría ser fatal si un sitio web es vulnerable a la inclusión de archivos locales. –

+0

@TimeSheep Las extensiones jif, jifif y jpe se pueden convertir a jpeg en cualquier momento sin problema, simplemente renombrándolas. jif es más corto a jifif debido a un viejo sistema de ventanas que no podía reconocer extensiones de 4 dígitos. Entonces eso no será un problema tanto .gif .svg .png .psd (los psds en capas simples se pueden ver a través del navegador) ... Cualquier buena lógica WhiteHorse, sigan así: D –

+0

Si pensé que el formato era significativo, probablemente lo hubiera editado :) Es solo algo a tener en cuenta. Lo más significativo que mencioné es que 'end (explode ($ image_file,". "))' Sería un enfoque más inteligente, ya que puede manejar extensiones de longitud arbitraria. Finalmente, el uso de try/catch es marginalmente más seguro, ya que alguien que por alguna razón tiene acceso de ejecución pero no de escritura, podría cargar un script disfrazado de imagen y luego ejecutarlo. Pero eso es probablemente un estúpido caso de borde :) No estoy seguro, pero 'getimagesize()' también podría evitar ese problema. –

3
//Image Processing 
    $cover = $_FILES['cover']['name']; 
    $cover_tmp_name = $_FILES['cover']['tmp_name']; 
    $cover_img_path = '/images/'; 
    $type = exif_imagetype($cover_tmp_name); 

if ($type == (IMAGETYPE_PNG || IMAGETYPE_JPEG || IMAGETYPE_GIF || IMAGETYPE_BMP)) { 
     $cover_pre_name = md5($cover); //Just to make a image name random and cool :D 
/** 
* @description : possible exif_imagetype() return values in $type 
* 1 - gif image 
* 2 - jpg image 
* 3 - png image 
* 6 - bmp image 
*/ 
     switch ($type) { #There are more type you can choose. Take a look in php manual -> http://www.php.net/manual/en/function.exif-imagetype.php 
      case '1' : 
       $cover_format = 'gif'; 
       break; 
      case '2' : 
       $cover_format = 'jpg'; 
       break; 
      case '3' : 
       $cover_format = 'png'; 
       break; 
      case '6' : 
       $cover_format = 'bmp'; 
       break; 

      default : 
       die('There is an error processing the image -> please try again with a new image'); 
       break; 
     } 
    $cover_name = $cover_pre_name . '.' . $cover_format; 
     //Checks whether the uploaded file exist or not 
      if (file_exists($cover_img_path . $cover_name)) { 
       $extra = 1; 
       while (file_exists($cover_img_path . $cover_name)) { 
     $cover_name = md5($cover) . $extra . '.' . $cover_format; 
        $extra++; 
       } 
      } 
    //Image Processing Ends 

este nombre de la imagen hará que parecen frescos y únicos

0

personas están recomendando el uso de getimagesize() but the documentation lee:

Precaución Esta función espera el nombre de archivo sea un archivo de imagen válido. Si se proporciona un archivo sin imagen, puede detectarse incorrectamente como una imagen y la función volverá a funcionar correctamente, pero la matriz puede contener valores sin sentido.

No utilice getimagesize() para verificar que un archivo dado sea una imagen válida. Use una solución especialmente diseñada como la extensión Fileinfo en su lugar.

La función relevante en la extensión Fileinfo es finfo_file():

string finfo_file (resource $finfo , string $file_name = NULL 
    [, int $options = FILEINFO_NONE [, resource $context = NULL ]]) 

Devuelve una descripción textual del contenido del argumento file_name o FALSO si se ha producido un error.

valores Ejemplo de retorno dadas son: text/html, image/gif, application/vnd.ms-excel

Sin embargo, los comentarios sobre la página oficial de la documentación advierten que esto no debe ser invocado para la validación tampoco.

Cuestiones relacionadas