Upload Form en PHP

En esta entrada se explicará como hacer un form (ya que estamos en este tema desde hace ya algunas entradas), con ayuda de PHP para subir un archivo al servidor, poner un codigo CAPTCHA para seguridad, establecer tamaño maximo del archivo y extenciones permitidas:

Upload

En esta entrada, usaremos conocimientos adquiridos de entradas anteriores, que listare aqui:

Ahora bien, lo primero es entender como funciona el upload en PHP.

diagrama

Ahora bien lo necesario por partes.

El fomrulario en HTML

El motor en PHP

Imagen CAPTCHA en PHP

Directorio con permisos  leer-escribir (777)

Ahora el codigo

El formulario (formulario.html)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Subir</title>
</head>

<body>
<form action="motor.php" method="post" enctype="multipart/form-data">
  <p>Extensiones admitidas: .jpg ,.gif , bmp, .png
  <p>Tama&ntilde;o Maximo: 0.5mb

  <p>
     <label for="archivo">Selecciona un Archivo:</label>
     <input type="file" name="userfile" id="archivo">
     <br />
     <img src="captcha.php" alt="" />
   <p>Introduce el C&oacute;digo
     <input name="introducido" type="text" />
     <br />
     <input name="Enviar" type="submit" value="Enviar" />
   <p>
</form>
</body>

El motor (motor.php)

 session_start();
if (isset($_POST['Enviar'])) {

if( $_SESSION['CAPTCHA'] != $_POST['introducido'])
{
exit('Codigo Captcha Erroneo');
}
   // Configuracion
      $ext_admitidas = array('.jpg','.gif','.bmp','.png'); // Extensiones permitidas.
      $peso_max = 524288; // Tamaño maximo en  BYTES (eso equivale a 0.5MB).
      $subir_a = './archivo/'; // directorio a subir .

   $filename = $_FILES['userfile']['name']; // Obtiene el nombre del archivo, y su extension.
   $ext = substr($filename, strpos($filename,'.'), strlen($filename)-1); // Saca su extension.

   // Verifica si la extension es valida.
   if(!in_array($ext,$ext_admitidas))
      die('Formato invalido.');

   // Verifica el tamaño maximo.
   if(filesize($_FILES['userfile']['tmp_name']) > $peso_max)
      die('Archivo muy grande.');

   // Verifica permisos.
   if(!is_writable($subir_a))
      die('Permisos insuficientes .');

   // Mueve el archivo a su lugar correpondiente.
   if(move_uploaded_file($_FILES['userfile']['tmp_name'],$subir_a . $filename))
         echo 'Listo! <a href="' . $subir_a . $filename . '" title="Descarga">Tu archivo</a>'; // It worked.
      else
         echo 'Error.'; // error xD .
}

else {
echo "No accedas directamente a esta pagina.";
}</code>
<p style="text-align: left;"></p>
<p style="text-align: left;">El captcha (captcha.php)</p>
<code lang="php"> session_start();

$string = substr(md5(microtime() * mktime()),0,3);
$captcha = imagecreatefrompng("fondo.png");
$color = imagecolorallocate($captcha, 0, 0, 63);
$linea = imagecolorallocate($captcha,63,63,63);
imageline($captcha,0,0,39,29,$linea);
imageline($captcha,55,0,0,29,$linea);
imageline($captcha,40,0,64,29,$linea);
imagestring($captcha, 5, 10, 5, $string, $color);
$_SESSION['CAPTCHA'] = $string;
header("Content-type: image/png");
imagepng($captcha);

Como pueden ver, todo esta comentado en el motor para su sencilla comprensión, cualquier duda en la sección de comentario tengan en cuenta que el codigo es de fines educativos solamente, para educar sobre conceptos y metodos de implementacion
Finalmente, dejo un ejemplo y la versión para descargar.

    Posts Relacionados

    4 Comentarios en “Upload Form en PHP”

    1. avatar
      wariodiaz 9 octubre 2009 at 7:13 pm #

      Saludos, ps una observacion en tu codigo, no es 100% seguro, tienes un pequeño fallito, = si lo puedes contemplar, las validaciones de tipo de archivos no se deverian de hacer por extencion, eso es una validacion devil, ya que el usuario puede modificar el nombre de su archivo incluyendo su extencion, eso hace que sea posbile subir un archivo .php en lungar de un .jpg, solo abria que renmobrar foto.php por foto.jpg y listo tu validacion ya no funciona :S. y si el usuario tiene control sobre esos archivos despues de.. y puede renombrar nuevamente a .php olvidate de lo que puede hacer un usuario con el acceso a un php en tu sevidor.. con un vastaria para tener un ueco enorme en el servidor :S, para validar los tipos de archivo te recomiendo verificar con los tipos MIME, y el campo $_FILES['fichero'][type], el explorador te envia el tipo mime del archivo, es un poco tedioso por que no siempre todos los exploradores mandan el mimo MIME por lo que hay que estar checando que mime nos envia el explorador y validar por este, el mime tambien lo podria modificar teniendo la malevola intencion pero por lo menos no es tan facil como cambiar una extencion

      aparte, es vastante incomodo dejar un comentario en tu blog, imaginate si no tubieren ninguna de esas redes una cuenta, ya me hisistes entrar a una cuenta, si no quieres spam mejor pon una imagen de valoracion, esto la verdad es incomodo.
      Pakos
      http://w00t.in/jpqwj

      Usando Firefox 3.5.3 Firefox 3.5.3 en Windows XP Windows XP
      • avatar
        b@cHo 9 octubre 2009 at 7:35 pm #

        Cito la ultima parte del tutorial,
        Como pueden ver, todo esta comentado en el motor para su sencilla comprensión, cualquier duda en la sección de comentario tengan en cuenta que el codigo es de fines educativos solamente, para educar sobre conceptos y metodos de implementacion

        El servicio de proveedores de 3eros no es solo para evitar spam, aparte todos los usuarios de internet en estos tiempos y es sencillamente para evitar la carga en el
        servidor.

        saludos y gracias por la sugerencia
        pd: no existen los codigos 100% seguros

        Usando Google Chrome 4.0.221.6 Google Chrome 4.0.221.6 en Windows XP Windows XP
    2. avatar
      juanhidgo 7 febrero 2011 at 3:59 pm #

      Hola. Mira no se mucho sobre php, pero me gustaría saber cómo se podría generar un cargador con porcentaje de los archivos que se suben….tienes alguna idea de cómo hacerlo?

      Por cierto que esta guía me ha servido mucho ya que estoy haciendo un gestor de subida de archivos para una empresa de impresión digital, de manera que los clientes puedan subir sus archivos al servidor sin necesidad de enviarlos por email.

      Lo del cargador sería la cereza en la crema de este exquisito código que compartes con el mundo.

      Gracias!

      Usando Firefox 3.6.13 Firefox 3.6.13 en Windows 7 Windows 7

    Deja un comentario

    Tienes que estar logueado para escribir un comentario.