Validando imagenes en PHP

December 28, 2005

A raiz de un proyecto web para una empresa que cayo en mis manos, he estado aprendiendo en estos dias PHP, ya que no sabia nada de este lenguaje :P . Por lo que he visto, PHP es sumamente facil de aprender, bueno tal vez me sirvio de base mis conocimientos en C/C++/C# :D , pero para cualquier impetuoso habido de aprender PHP, no debe ser nada dificil de asimilar. Y ahora estoy aqui para compartir un poco de lo que aprendido :) .

Bueno al asunto, si se tiene un formulario en donde se le pide un usuario que suba una imagen, ya sea para copiarla en una carpeta del server o guardarla en un base de datos, es necesario validar dicho archivo antes de realizar cualquier accion con este.

Para el caso de archivos, PHP nos ofrece una serie de variables a las que podemos acceder con la información del archivo enviado. Puedes usar $_HTTP_POST_FILES o $_FILES, como gustes, yo prefiero el segundo :P .

  • $_FILES[’userfile’][’name’]. El nombre original del fichero en la máquina cliente.
  • $_FILES[’userfile’][’type’]. El tipo mime del fichero (si el navegador lo proporciona). Un ejemplo podría ser “image/gif”.
  • $_FILES[’userfile’][’size’]. El tamaño en bytes del fichero recibido.
  • $_FILES[’userfile’][’tmp_name’]. El nombre del fichero temporal que se utiliza para almacenar en el servidor el archivo recibido.

Primero que nada un archivo no puede tener 0 bytes y si le puede limitar a un tamaño para que el usuario no pueda subir un archivo muy grande y nos eche a perder el dia :P . Luego hay que verificar que el archivo sea una imagen. Vamos al codigo :

Si se quiere aceptar cualquier tipo de imagen.

<?php
$filesize = $_FILES['userfile']['size'];
$filetype = $_FILES['userfile']['type'];

if ( $filesize > 0 && $filesize <= 100000 && strpos($filetype,"image") != false ) {
//realizar acciones
}
else
echo "imagen no valida!.";
?>

En este codigo estamos limitando que la imagen no pese mas de 100kb, con strpos(filetype,”image”) validamos que el tipo de archivo sea una imagen ya que este filetype puede contener: image/gif, image/png, etc. Si vamos a utilizar las imagenes subidas, por ejemplo en una galeria de imagenes, no es muy recomendable que el usuario pueda subir cualquier tipo de imagen, ya que hay imagenes que no son aptas para web. Ahora vamos a restringir que solo pueda subir los de tipo jpeg, gif y png:

<?php
$filesize = $_FILES['userfile']['size'];
$filetype = $_FILES['userfile']['type'];
$type = substr($filetype, (strpos($filetype,"/"))+1);
$types=array("jpeg","gif","png");

if ( $filesize > 0 && $filesize <= 100000 && in_array($type, $types) ) {
// realizar acciones
}
else
echo "Imagen no valida!.";
?>

Como vemos tenemos un array donde especificamos los tipos de imagen que son aceptados, y luego con la funcion in_array buscamos si tipo ($type) de la imagen proporcionada por el usuario se encuentra en el array devolviendonos true si esta y false sino. Este codigo no solo nos sirve para imagenes sino para cualquier tipo de archivo que nosotros queremos validar.

Nota: PHP saca el tipo del archivo segun su MimeType, esto quiere decir que si a un archivo de texto con extension TXT lo cambio la extension a JPG, php no lo toma como imagen (image/jpeg) sino como texto (text/txt) . Recordarles que recien empiezo con PHP, asi que cualquier sugerencia será bienvenida :) .

Ahi los vidrios :D .

3 Comments »

La dirección para el TrackBack a esta entrada es: http://juanpe.blogsome.com/2005/12/28/validando-imagenes-en-php-2/trackback/

  1. Para los tipos de archivo: http://www.google.es/search?q=php+mime+type+detect

    PD: s/habido/ávido/

    Comentado por maeghith — December 28, 2005 @ 11:57 pm

  2. Para saber qué es realmente un archivo independientemente de la extensión, mientras que el hosting sea Linux, puedes usar el comando file mediante un shell_exec:

    $tipo=shell_exec(”file “. $_FILES[’userfile’][’tmp_name’]);

    En la variable $tipo tendrás algo como:

    images/logo.jpg: JPEG image data, JFIF standard 1.01

    Buscando (con regexp por ejemplo) la cadena JPEG puedes saber a ciencia cierta si es o no un jpg.

    Comentado por mariodebian — December 29, 2005 @ 2:20 pm

  3. Gracias mario, ya tome nota de tu sugerencia :P

    Comentado por juanpe — December 29, 2005 @ 8:17 pm

RSS feed para los comentarios en este post.

Deja tu comentario

Los saltos de linea son automaticos, el e-mail no se hace publico. HTML permitidos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


Very Happy Smile Sad Surprised Shocked Confused Cool Laughing Mad Razz Embarassed Crying or Very sad Evil or Very Mad Twisted Evil Rolling Eyes Wink
Exclamation Question Idea Arrow Neutral Mr. Green