Tutorial de gestion de formularios/subida de ficheros

rargueso
03 de Diciembre del 2003
Puesto que es una duda bastante comun aqui os dejo el codigo de como yo gestiono los formularios y subo imagenes.

Con respecto a la gestion de formularios, observad que los datos se validan en el SERVIDOR, asi que no hay posibilidad de manipulacion con la construccion de un formulario malicioso. El javascript solo se usa para sacar la ventana de error, no para validar. Espero que os sirva. Un saludo y ahi va ese codigo



<?
include $_SERVER["DOCUMENT_ROOT"]."/administracion/lib/admin.inc.php"; //Mis librerias de funciones

limpiar_html_array($_POST); //Funcion que limpia de HTML lo que llegue por por POST
if (isset($_POST["action"])){ //Si llego del formulario ...
$js_error = ""; //Inicializo mi variable de errores para javascript
if ($_POST["nombre"]=="") { //Compruebo el nombre
$js_error.="Inserte un nombre.\n";
}
//De la misma manera se pueden validar todos los campos que queramos, con los criterios que queramos
//Validamos imagen
if (is_uploaded_file($_FILES['imagen']['tmp_name'])) { //Si el fichero ha subido
//comprobamos el tamaño
if ($_FILES["imagen"]["size"]>25600) {
$js_error.="El tamaño de la imagen sobrepasa los 15K. Optimizela o elija una mas pequeña.\n";
} else {
//Guardamos el mime
$mime=$_FILES["imagen"]["type"];
//Leemos y llevamos a una variable
if ($fichero=fopen($_FILES["imagen"]["tmp_name"],"r")) {
$imagen = fread($fichero, 25600);
fclose($fichero);
//Codificamos a B64 y troceamos para poderlo insertar en base de datos
$imagen=chunk_split(base64_encode($imagen));
} else {
$js_error.="No se puedo leer la imagen.\n"; // Puede ocurrir cuando el temporal no tiene permisos de lectura
}
}
}
//Si no hay errores
if ($js_error==""){
echo create_admin_header("Productos","Nuevo Producto.", ""); //Funcion que escribe el interface web
//insertamos en BBDD
$sql="INSERT INTO `tabla` ( `id` ,`nombre`, `imagen`,`mime` ) ".
"VALUES ('' , '".$_POST["nombre"]."', '".$imagen."' , '".$mime."')"; //Uso la variable sql para poder hacer debug ;-)
if ($consulta=mysql_query($sql) or die (mysql_error())) {
echo "<center>Registro insertado correctamente.<br><br><a href='../'>Volver</a></center>";
} else {
echo "<center>Registro NO insertado. Consulte con el webmaster.<br><br><a href='../'>Volver</a></center>";
}
echo create_admin_footer(); //Funcion que cierra el interface web
exit();
}//if
}//if
//Por aqui entro la primera vez, cuando no se ha mandado el formulario ninguna vez
echo create_admin_header("Productos","Nuevo Producto.", ""); //Funcion que escribe el interface web
//EL formulario debe tener enctype definido o no podras enviar ficheros
?>
<form name="formulario" enctype="multipart/form-data" action="<? echo $_SERVER["SCRIPT_NAME"]; ?>" method="post">
<input type="hidden" name="action" value="Send">
<table border="1" cellspacing="0" cellpadding="3" align="center" class="Tabla">
<tr>
<td valign="top" class="CabeceraTabla" align="right">Nombre:</td>
<td class="CeldaTabla">
<input type="text" name="nombre" value="<?echo $_POST["nombre"]; //La primera vez vacio, las demas lo que meta el user?>">
</td>
</tr>
<tr>
<td valign="top" class="CabeceraTabla" align="right">Imagen&nbsp;(25K m&aacute;ximo):</td>
<td class="CeldaTabla"><input type="file" name="imagen" class="Texto"></td>
</tr>
<tr>
<td class="CabeceraTabla">&nbsp;</td>
<td class="CeldaTabla"><input type="submit" name="done" value="Alta" class="Boton"></td>
</tr>
</table>
</form>
<?
echo create_admin_footer (); //Funcion que cierra el interface web

if ($js_error!=""){ //SI hay errores, ventanita de javascript ...?>
<script language="JavaScript" type="text/javascript">
<!--
alert('<? echo("$js_error");?>');
//-->
</script>
<?}?>