PHP
Upload Form en PHP
29 de Junio del 2009 por b@cHo · 2 Comentarios
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...
- Textos Aleatoreos Con este sencillo script en PHP se puede dar a...
- Verificador de Permisos PHP Con este script podemos verificar si el CHMOD concuerda con...
- Visores CHM para linux Los archivos Microsoft Compiled HTML Help o CHM por sus...
- BBCode en PHP Quien haya frecuentado foros, esta familiarizado con el BBcode, pero...











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
<a href="http://w00t.in/jpqwj" rel="nofollow">http://w00t.in/jpqwj</a>
Cito la ultima parte del tutorial,
<blackqoute>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</blackqoute>
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