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:
En esta entrada, usaremos conocimientos adquiridos de entradas anteriores, que listare aqui:
Ahora bien, lo primero es entender como funciona el upload en PHP.
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ñ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ó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
- Creando un CAPTCHA Pués debido a mi entrada anterior, me gustaria dar a...
- Enviar un correo con Adjunto mediante PHP Como dice el título de la entrada, hoy abarcaremos de...
- BBCode en PHP Quien haya frecuentado foros, esta familiarizado con el BBcode, pero...
- Sistema sencillo de login en PHP En esta entrada veremos como crear un sistema de login...
- Limitar el intento de inicios de sesión Hoy en día con tantas facilidades para realizar ataques de...
- Visores CHM para linux Los archivos Microsoft Compiled HTML Help o CHM por sus...





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.
UsandoPakos
http://w00t.in/jpqwj
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
Usandopd: no existen los codigos 100% seguros
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!
UsandoSe me ocurre de manera rápida, una combinación de jQuery + el plugin Progressbar (http://plugins.jquery.com/project/jQueryProgressBar), y la extensión de PHP llamada uploadprogress (http://pecl.php.net/package/uploadprogress) Creo que para estas implementaciones encontrarás muchos ejemplos en Internet, así que eso seria lo que te correspondería investigar
Saludos
Usando