Ajax File Upload ?
Introducción
Se ha escrito y discuto mucho sobre si es o no es factible utilizar AJAX para subir un archivo al servidor. Por una necesidad personal yo también me vi involucrado en esta serie de discusiones. La finalidad de este artículo es que le sea útil a alguien; principalmente a mi.
Entonces …
Al finalizar este pequeño tutorial deberías entender a la perfección este ejemplo.
Primer Error: Titulo Mal Empleado
Me voy a disfrazar de traductor en Inglés. Sería algo como Archivo Subido con AJAX. Esto, hoy por hoy, no se puede hacer. Es así y no hay vuelta que darle.
Entonces usted dirá …
- heeee, si yo en gmail puedo subir archivos y lo hago con AJAX !!!.
Yo le respondo …
- No sea bobo, yo también creía lo mismo.
Hay sobradas muestras que el objeto XMLHttpRequest no puede enviar archivos al servidor.
Entonces deberíamos cambiar el titulo del post. Sería así:
Ajax File Upload SIN Ajax
Frente a esta inmutable condición los desarrolladores han buscado una buena forma de simular scripts para subir archivos al servidor como si fuese con AJAX, y por lo menos conmigo lo lograron.
- Tenemos un formulario con un campo tipo file, el cual nos permitirá enviar el archivo a nuestro servidor PHP. La respuesta del servidor se hará en el IFRAME, actor principal de esta novela.
- El script ejecutado en nuestro server a causa del action del formulario es el encargado de copiar el archivo temporal en un espacio físico dentro del mismo.
- Luego, con un poco de ayuda de JS imprimiremos un mensaje correspondiente al estado final de nuestro script.
Primer Ejemplo – Subir un Archivo el Server
Utilizaremos tan solo dos scripts muy sencillos. Luego iremos mejorando y complementando el desarrollo hasta llegar a nuestro objetivo.
<form method="post" enctype="multipart/form-data" action="controlUpload.php" target="iframeUpload"> <input type="hidden" name="phpMyAdmin" /> Archivo: <input name="fileUpload" type="file" /> <input type="submit" value="enviar"> <iframe name="iframeUpload"></iframe> </form>
Es es un simple formulario HTML con un campo FILE y un marco flotante iframe denominado iframeUpload. Cuando enviamos el archivo al servidor ejecutaremos el script controlUpload.php y la respuesta del server se hará en nuestro iframe ya que apuntamos al mismo dentro de la etiqueta target en la declaración form.
// Script Que copia el archivo temporal subido al servidor en un directorio.
echo '<p>Nombre Temporal: '.$_FILES['fileUpload']['tmp_name'].'</p>';
echo '<p>Nombre en el Server: '.$_FILES['fileUpload']['name'].'</p>';
echo '<p>Tipo de Archivo: '.$_FILES['fileUpload']['type'];
$tipo = substr($_FILES['fileUpload']['type'], 0, 5);
// Definimos Directorio donde se guarda el archivo
$dir = 'archs/';
// Intentamos Subir Archivo
// (1) Comprovamos que existe el nombre temporal del archivo
if (isset($_FILES['fileUpload']['tmp_name'])) {
// (2) - Comprovamos que se trata de un archivo de imágen
if ($tipo == 'image') {
// (3) Por ultimo se intenta copiar el archivo al servidor.
if (!copy($_FILES['fileUpload']['tmp_name'], $dir.$_FILES['fileUpload']['name']))
echo '<script> alert("Error al Subir el Archivo");</script>';
}
else echo 'El Archivo que se intenta subir NO ES del tipo Imagen.';
}
else echo 'El Archivo no ha llegado al Servidor.';
controlUpload.php | Ver
Cuando se ejecuta el script, este intenta rescatar los datos del archivo a subir. Para eso se vale del array global de PHP $_FILES. Si no estas muy familiarizado recomiendo que leas esta sección del manual oficial para entender su funcionamiento y sus particularidades.
En las primeras líneas presentamos el nombre del archivo temporal generado por nuestro motor PHP, el segundo es el nombre real del archivo y el tercero es el tipo de archivo.
Si estos valores están definidos evidentemente el archivo llego al server. Estas líneas mas adelante no las utilizaremos; ahora sólo las usamos para realizar el seguimiento del script.
Asignamos a $tipo el tipo de archivo para poder controlar que sea una imágen. Se cortan los primeros 5 caracteres y si todo es correcto $tipo tendrá el valor image. Si no es una imagen tendrá un valor distinto. Este control se puede hacer de diversas formas; nosotros utilizamos esta.
Luego, intentamos copiar el archivo temporal en forma definitiva en algún sector físico en nuestro servidor. Se verifica en forma anidada definición de nombre temporal de archivo, tipo de archivo y si el motor concretó la copia.
En este ejemplo lo hacemos en la carpeta archs/.
Si está todo bien podemos pasar al segundo paso.
En este link podemos probar el script. Podemos ver los archivos subidos al server en este link.
Aclaraciones.
Hay que definir permisos de escritura de PHP en el directorio a copiar el archivo. En nuestro caso es la carpeta archs.
Armando el Circo
Empecemos a modificar un poco los archivos anteriores.
En primer lugar vamos a eliminar el botón submit Enviar y vamos a disparar el formulario con una orden en JS.
onchange="javascript: submit()"
Vamos a ocultar el iframe.
style="display:none"
Al final del archivo agregamos una línea que nos dirige a un simple script que nos muestra los archivos subidos al server; más que nada para que puedas corroborar la funcionalidad.
<a href="verArchivos.php">Ver Archivos</a>
Esta línea no se presenta en el script.
<form method="post" enctype="multipart/form-data" action="controlUpload2.php" target="iframeUpload"> Archivo: <input name="fileUpload" type="file" onchange="javascript: submit()" /> <br /><iframe name="iframeUpload" style="display:none"></iframe> </form>
Y al script controlUpload.php le vamos a agregar alertas de control (también con JS por ahora). Además vamos a eliminar sentencias que se han vuelto innecesarias al ocular el iframe.
// Script Que copia el archivo temporal subido al servidor en un directorio.
$tipo = substr($_FILES['fileUpload']['type'], 0, 5);
// Definimos Directorio donde se guarda el archivo
$dir = 'archs/';
// Intentamos Subir Archivo
// (1) Comprovamos que existe el nombre temporal del archivo
if (isset($_FILES['fileUpload']['tmp_name'])) {
// (2) - Comprovamos que se trata de un archivo de imágen
if ($tipo == 'image') {
// (3) Por ultimo se intenta copiar el archivo al servidor.
if (!copy($_FILES['fileUpload']['tmp_name'], $dir.$_FILES['fileUpload']['name']))
echo '<script> alert("Error al Subir el Archivo");</script>';
else
echo '<script> alert("El archivo '.$_FILES['fileUpload']['name'].' se ha copiado con Exito");</script>';
}
else echo '<script> alert("El Archivo que se intenta subir NO ES del tipo Imagen.");</script>';
}
else echo '<script> alert("El Archivo no ha llegado al Servidor.");</script>';
controlUpload2.php | Ver
Ya se empieza a parecer a un verdadero AJAX FILE UPLOAD. Que siga el circo !. Show must go on.
Finalmente un sencillo Script
Con estas últimas modificaciones tendremos la base final para poder implementar nuestro FILE UPLOAD con un comportamiento muy similar a gmail.
Al formulario lo vamos a contener en un div con id formUpload.
<div id="formUpload">
Al archivo upload3.php, aparte del formulario de envío le vamos a agregar una sencilla función resultadoUpload (estado, file) realizada en JS que, dependiendo del código que nos ‘envíe’ controlUpload.php en las variales estado y file (ahora vemos como …) imprimirá en dicho div un mensaje de respuesta al intento de subida.
function resultadoUpload(estado, file) {
var link = '<br /><br /><a href="upload3.php">Subir Archivo</a> - <a href="verArchivos.php">Ver Imagenes</a>';
if (estado == 0)
var mensaje = 'El Archivo <a href="archs/' + file + '" target="_blank">' + file + '</a> se ha subido al servidor correctamente' + link;
if (estado == 1)
var mensaje = 'Error ! - El Archivo no llego al servdor' + link;
if (estado == 2)
var mensaje = 'Error ! - Solo se permiten Archivos tipo Imagen' + link;
if (estado == 3)
var mensaje = 'Error ! - No se pudo copiar Archivo. Posible problema de permisos en server' + link;
document.getElementById('formUpload').innerHTML=mensaje;
}
La impresión de nuestro mensaje en el div lo hace en la última linea de la función.
document.getElementById('formUpload').innerHTML=mensaje;
Este sitio tiene una buena descripción del conjunto de funciones getElementBy*. De todas formas, con un poco de tu gran astucia podrás encontrar muchos ejemplos de su funcionamiento.
Ahora solo resta modificar controlUpload.php para que en vez de ejecutar una ventana alert () (como en el ejemplo anterior) simplemente ejecute el código JavaScript para llamar a la función resultadoFile () enviándole los datos correspondientes al intento de subida del archivo.
El punto llamativo es como accedemos desde el iframe oculto a la función que se encuentra en la página que lo contiene. Utilizamos la palabra reservada de JS parent.
<script>parent.resultadoUpload(estado, file);</script>
Las otras modificaciones son para mejorar estéticamente las páginas. También se utilizan dos scrips en php. verArchivos.php para ver los archivos subidos y eliminar.php que no requiere demasiada explicación.
- upload3.php | ver | ejecutar
- controlUpload3.php | ver
- verArchivos.php | ver | ejecutar
- eliminar.php | ver
- Conjunto de todos los scripts upLoader.tar.gz y upLoader.rar
Finalizando
Este humilde tutorial se hizo más largo de lo que hubiese querido. Voy a seguir trabajando para mejorar el funcionamiento y evolucionarlo. Queda pendiente una barra de progreso (ahí creo que no podemos escapar de AJAX) y otras formas de aplicación.
Tomen al mismo y a todo el código como una guia par desarrollar esta pequeña aplicación. Faltan muchos controles de errores, de seguridad, etc. El código fuente presentado no es idéntico a los archivos que se pueden descargar; esto es simplemente por una cuestión de prolijidad.
Disculpen mi desorden semántico y gramatical; como la mayoría, soy atrevido al jugar el papel de tutor. Nada más lejos de mis fines. Simplemente lo mío es ayudar como así también me han ayudado.
Saludo muy grande a la gente de ForosDelWeb.

RetroFOX
19 Sep, 2007
Ahora trato de borrala. Saludos.
next
7 Nov, 2007
jajajaja pajaron X) califa
buen script man saludos…
Gustavo
26 Nov, 2007
Hola… muy bueno el script y la explicación. Tenés alguna idea de como puedo hacer para el seguimiento del archivo. Se puede con este script?. Es decir… una barra de progreso sería perfecto…pero si es complicado.. hay alguna forma que el usuario por lo menos vea “Cargando…” solamente?
Gracias.
RetroFOX
27 Nov, 2007
Lo de la barra de progreso … casi que te diría que te olvides. A ver, en realidad todo depende del servidor. Si vos tenes un server propio y podes modificarlo a tu gusto, entonces podrías parchear PHP o utilizar algun script en pyton; no lo se con exactitud, pero algo así tenes que hacer.
Pero si estás en un hosting o servicio dedicado donde no tenes mucha libertad, olvidate.
Respecto a cargando …; seguro que se puede … es adornar un poco más este código.
Saludos y gracias por el comentario.
javier
4 Dic, 2007
la verdad me ahorraste mucho tiempo y un lujo leer tus letras es muy llevadero, gracias por tu aporte.
RetroFOX
5 Dic, 2007
Gracias Javier por tu comentario.
Saludos.
Hernán
26 Dic, 2007
EXCELENTE EL CÓDIGO!!!!!!!
RetroFOX
27 Dic, 2007
Gracias Hernan. Un Saludo. Felices Fiestas.
dinamo
31 Dic, 2007
gracias amigo por tu ayuda y desinterés al realizar y explicar tan bien tu código en forma desinteresada gracias a estos aportes cada vez aprendemos mas y la web se hace un lugar donde cada cual puede aportar algo
RetroFOX
1 Ene, 2008
Bueno, gracias dínamo; esa es la idea de este artículo. Saber que es útil es para mi un pequeño logro. Saludos.
ODUQUE
4 Ene, 2008
Muy buen artículo, te felicito. No creo que haya que hacerlo más corto, así esta muy bien.
Tengo una necesidad puntual y preguntica,
Tengo un formulario que envía información via ajax al guardar y adiciono este nuevo formulario para enviar un archivo (el de este artículo), quedando por ejemplo algo así:
Adicionar foto: [_________][Examinar...]
Nombre: [_____________] – Apellido: [_____________][Guardar]
Ya que en el proceso normal debe examinar y subir la foto antes de guardar, la pregunta es la siguiente:
Donde pongo la foto (archivo) temporalmente, con que nombre (archivo) y como luego hago para anclarla o relacionarla con este formulario que se va a guardar?
Muchas gracias.
RetroFOX
4 Ene, 2008
Creo que son dos procesos independientes … donde vas a tener que usar tu picardía para relacionar los datos con la imagen.
Vas a tener básicamente dos scripts (.php supongamos) de control de transferencia. Uno, el de los datos del formulario, que será llamado por AJAX y el otro que es llamado mediante este artilugio, Lo que deberías hacer es tratar de relacionar estos scripts para que cuando, por ejemplo, se concrete el upload puedas relacionar ese archivo con los datos. Tal vez deberías usar algunas variables globales.
La verdad que no lo he implementado. Debería haber info en la red.
Saludos; perdón por el poco apoyo concreto.
ODUQUE
4 Ene, 2008
Muchas gracias
Ya tengo la solución, eso creo, voy a mostarte al final como quedó.
RetroFOX
4 Ene, 2008
Encantado de la vida
Legion
8 Ene, 2008
Muchas gracias por el artículo. Muy bueno!!
Me fue de mucha ayuda. Era justo lo que estaba necesitando!
RetroFOX
8 Ene, 2008
Bueno, de nada nuevamente. Es un placer que te haya servido. Saludos.
enZzo
24 Ene, 2008
Olas!! broder, muy wen tutorial.. too bien pero como soy nuevo en esto como hago para elimanar, dejaste ahi el php para eliminar, como hago para linkear la imagen y envia direccion y la elimine.
Urgente.
SALUDOS
RetroFOX
25 Ene, 2008
La verdad no recuerdo enZzo como lo hice en su momento, pero no creo que sea muy dificil. Debes buscar el nombre de la variable que le es pasado al script eliminar.php. Debes tener una línea similar a $_GET['nombreArchivo'] … entonces para eliminar el archivo debes llamar a eliminar pasando por URL el nombre del archivo en cuestión; por ejemplo … eliminar.php?nombreArchivo=cara.png.
Si observar un poco el código podrías lograrlo sin problemas.
Saludos.
david
31 Ene, 2008
Hola
Alguien sabe de algún servidor que soporte perl?
Ise un script de upload con barra de progreso pero no lo pude adaptar para php.
Gracias
RetroFOX
5 Feb, 2008
es que si no puedes hacer correr tu script escrito en perl, no vas a poder realizar la barra de progreso porque PHP solo no puede hacerlo. Y no creo que un servidor te permita correr scripts en perl; salvo que el servidor sea tuyo.
Gracias por comentar.
smeerkahoven
22 Feb, 2008
hola
RetroFox….quisiera hacerte muchas preguntas..y las voy a hacer
1.- Se puede cargar archivos sin utilizar el tag input type=file q html nos da?
2. SI existe una manera me podrias orientar ?
3. Lo q deseo hacer es una multiple carga de archivos…q el cliente solamente va ha ver las url para realizar el uploading :
/home/me/file1
/home/me/file1
/home/me/file1
y con un boton siguiente….se va a realizar la carga de los 3 archivos…sin utilizar el tag input type=file…
bueno..esperando respuestas…me despido
smeerkahoven
RetroFOX
22 Feb, 2008
Hola smmerkahoven.
1) Creo que la única forma de enviar un archivo al servidor es solamente con el tag input type=file; no creo que exista otra manera en HTML.
2) Me imagina que otras tecnologías como flash tal vez podrían permitirte subir archivos al servidor, pero yo de flash poco y nada. Lo mismo con algún applet de java.
3) Yo he realizado cargas de múltiples archivos, pero siempre con el campo tipo file.
Saludos. Nos vemos.
ricocsharp(cuba)
31 Mar, 2008
Bueno RetroFox muy bueno e ingenioso tu trabajo pero creo que como dice tu titulo al principio esto no tiene nada de ajax mas que es asincronico, mucha gente en el mundo del desarrollo web habla de AJAX y la mitad no sabe lo que realmente es, aqui les va una pequeña muelita(charlita) aclaratoria sobre el tema:
AJAX es un término “inventado” por Jesse James Garret para referirse a la utilización conjunta de las siguientes tecnologías:
Estándares de presentación: XHMTL y CSS
Interacción: DOM (Document Object Model)
Intercambio de datos: XML y XSLT
Interacción asíncrona con el servidor: XMLHttpRequest
Programación en el cliente: Javascript
osea que AJAX no es un lenguaje o una tecnologia , menos un standard es solo un modelo que adoptas o no, claro que como ves arriba la unica forma que en mi modesto conocimiento tienes de subir un file seria con el tag input type=file como bien dices arriba.claro con una pequeña aclaracion no para ti sino para los demas que leen esto buscando conocimiento este tag tambien conocido como fileUpload object es solamente una interfaz que permite al usuario especificar que fichero de su pc desea subir al server sin un CGI u otra tecnologia de servidor (ASP.net, ASP, JSP, JSF,COLD FUSION,PHP….. etc) este objeto no hace NADA
Damian
1 Abr, 2008
Claro, tienes razón. Aportar conocimiento casi nunca suele estar de más.
SAludos y gracias.
Roberto
18 Abr, 2008
Si dejas de ser egocentrico con siertas argumentos como “por lo menos conmigo lo lograron” y “La finalidad de este artículo es que le sea útil a alguien; principalmente a mi” el articulo hubiese quedado 100% perfecto ademas que falta de un poco mas de explicacion para los que no entendemos mucho de los iframe, gracias….
Ricardo
18 Abr, 2008
Muy buen artículo y muy bien explicado, excelente.
Y una consulta si fuese que ademas de un archvo se puede ingresar datos de texto???
http://www.amanra.com
RetroFOX
18 Abr, 2008
* Roberto … suerte.
* Ricardo: puedes subir los archivos que quieras, simeplemente debes modificar la parte de control del archivo. Saludos y Gracias.
Carlos Yerena
22 Abr, 2008
antes que nada felicitarte por tu aportación, está información posiblemente la tomaste del libro “AJAX Web 2.0″ de Alfaomega. Pero la simplicidad con la que lo explicas es exepcional tanto para novatos como para gente con experiencia, de verdad muchas felicidades.
Solo como observación y por las dudas que muchos tienen es que web 2.0 en realidad no es Ajax, Ajax sólo es una parte, ya que web 2.0 en realidad es una fusión entre lo asíncrono, webservices y aplicaciones web enriquesidas.
AJAX no es una tecnología en si, sino el conjunto de tecnologías, estándares y lenguajes que ya existían junto con el objeto HTTPRequest que se encuentra como objeto en todos los navegadores que soporten javascript (navegadores actuales para no entrar en detalles de versiones).
AJAX es Asynchronous Javascript And Xml y fue impulsado por google, junto con los webservices para darle pauta a Web 2.0
Saludos a todos y felicidades por este post
RetroFOX
23 Abr, 2008
Pues … gracias por tu comentario. Sin embargo debo decirte que no he tomado información del libro “AJAX Web 2.0″ ni mucho menos, si lo hubiese hecho estaría en los créditos del tutorial; allá de tu diplomacia me ha disgustado.
Nunca escuché hablar de ese Libro. Para dar fe de lo que digo, te dejo el link de un post de discusión del foro donde entre varias personas terminamos de entender esto. Ajax + Php + Upload Archivos. Mi nick en este foro es Calisco. Creo que habían un par de posts más relacionados con el tema.
Y fijate como termina el tutorial … Saludo muy grande a la gente de ForosDelWeb..
Saludos.
Carlos Yerena
25 Abr, 2008
Mi intensión no fué de ninguna manera pedirte que comentaras la fuente ya fuera de libros o de alguna otra web ni nada por el estilo, solo hice el comentario de que como referencia (al tener yo el libro) de isar iframes para la carga de archivos. El único fin de mi comentario es el felicitarte por la manera tan sencilla en que lo explicas, ya sea que exista o no una fuente publicada en algún sitio, lo importante es que tienes la facilidad de explicar lo que otros autores y en otros foros lo hacen complicado u omitiendo partes importantes del funcionamiento.
No mal interpretes las intensiones que tienen un buen fin que es felicitarte por tu manual.
Como fe de erratas de mi parte el libro no es “AJAX Web 2.0″ sino “Introducción a AJAX con PHP” de editorial Anaya de Lee Babin.
Si e algún momento te sentiste ofendido por mi comentario, sinceramente te pido disculoas porque de ninguan manera fué el fin de esto.
Por último, la finalidad de mencionar el libro es por si alguien está interesado en tener una bibliografía en casa que hace referencia a la carga de archivos.
RetroFOX
26 Abr, 2008
Ok, tenes razón; tal vez mal interpreté el comentario. Yo también te pido disculpas por la poca tolerancia y posible falta de comprensión. Agradezco tus elogios desde ya. Respecto a los libros, no los he leído; así que no puedo opinar.
Saludos y gracias.
Shiryu
23 May, 2008
Genial, muchas gracias. Me has ahorrado mucho tiempo de investigación.
RetroFOX
23 May, 2008
Gracias; como siempre digo, esa es la idea.
Saludos.
Franz
4 Jun, 2008
q tal, uso este mismo codigo para subir archivos de excel xls, pero me no me recoje en la parte $_file[excel][tmp] me sale que no puede subirse al servidor, espero que me puedan ayudar ps gracias…
RetroFOX
5 Jun, 2008
Deberías tratar de buscar el problema depurando tu script. Lo que te recomiendo es que implementes este ejemplo y una vez que funcione lo adaptes a tu necesidad. Simplemente tenes que cambiar el control de archivos.
Saludos y gracias por tu comentario.
Kender
2 Jul, 2008
Me ha gustado mucho tu post. Yo hice algo parecido, pero mostraba el iframe y solo podia subir archivos de uno en uno
eso si, no fue una mala aproximacion ^_^
Lo que te keria comentar es que he encontrado una clase bastante chula en este enlace:
http://phpclasses.irontec.com/browse/package/2759.html
Es basicamente lo mismo, pero un poco mas elaborado y preparado para que solo haya que hacer llamadas a funciones de un objeto (ademas, esta programado con objetos, obvio, que es un paso mas). Yo voy a makearlo para introducirlo en mi aplicacion, añadiendole archivos de idioma y modificando las funciones de despues de la subida.
Échatelo un ojo que seguro qeu te gusta
RetroFOX
2 Jul, 2008
Ok, le echaré un vistazo. Gracias por el dato. Saludos.
gu
26 Ago, 2008
Una cosilla, el boton submit lo puedes controlar mejor asi, ya que al pulsar “intro” en un campo de texto ejecuta igualmente la funcion:
[...]
Y en JS la funcion devolverá “true” si debe enviar el formulario y “false” de lo contrario.
Tambien puedes cambiar esto desde JS
document.getElementById(‘miformulario’).onsubmit = function () { blablabla }
RetroFOX
26 Ago, 2008
Es verdad … tienes razón gu; sólo que bueno … la idea no era complicar. En realidad se puede mejorar mucho más.
Saludos y gracias por tu comentario.
JONAS
5 Sep, 2008
Ssdsd
JONAS
5 Sep, 2008
dffddf
Sepucos
13 Oct, 2008
Esta chido One, el ejemplo,
Ivan
16 Oct, 2008
He visto que mas de uno pedía subir mas de un archivo a la vez, en mi blog encontraréis una herramienta muy sencilla, se llama SWF, lo he traducido al castellano y mejorado un poco.
http://programat.wordpress.com/2008/10/16/swfupload-multi-upload-archivos/
Saludos
Ivan
16 Oct, 2008
SWFUpload, perdon
EMANUEL
16 Oct, 2008
hola trate de descargar el ejemplo pero no funciona el link alguien me puede decir que pasa?
fancy upload
24 Oct, 2008
Yo he testeado bastante la aplicación Fancy Upload y es realmente personalizable.
Recordad que de manera global se pueden modificar valores en el fichero “FancyUpload2.js”… como el tamaño máximo de ficheros en bytes, el número maximo de ficheros, etc.
“limitSize: false,” ~ tamaño máximo
“limitFiles: 5,” ~ número máximo de ficheros
De manera individual, se realiza de otra forma, como detallo en mi sitio.
Un saludo,
Alejandro Arco
karencita
5 Feb, 2009
hola…. sabes me e matado buscando como subir la imagen de forma sencilla y con ajaz muy buen tuto…. gracias un beso…
RetroFOX
5 Feb, 2009
De nada. Gracias por tu comentario.
Marcelo
11 Feb, 2009
Hola amigo! Podrías subir los archivos otra vez al server para poder bajarlos?
Muchas gracias y buen tutorial.
Stormi
19 Feb, 2009
esta estupendo