A veces queremos subir archivos al servidor usando http a través de un formulario, normalmente creamos un campo tipo file y listo, pero en ocasiones queremos subir múltiples archivos, como es el caso de los archivos adjuntos de los mail, es hay donde un solo campo se nos hace ineficiente y engorroso, pues requiere que se envide de uno en uno los archivos, podríamos simplemente crear unos 5 campos file pero, que tal si el usuario quiere subir mas o menos archivos? estaríamos fosando al usuario a recargar la pagina varias veces, o desperdiciaríamos espacio, en cada caso respectivamente. Una solución elegante es la que vemos en el método de adjuntar archivos de gmail, que dando click en un enlace nos crea un nuevo campo file listo para adjuntar un nuevo archivo, esto se puede lograr usando javascript, y procesando con php lo recibido por el servidor. A continuación veremos un aproximación de como lograr resultados similares:
Primero veamos el html del formulario, sencillo solo lo necesario para subir archivos:
Código :
<form name="formu" id="formu" action="upload.php" method="post" enctype="multipart/form-data"> <dl> <dt><label>Archivos a Subir:</label></dt> <!-- Esta div contendrá todos los campos file que creemos --> <dd><div id="adjuntos"> <!-- Hay que prestar atención a esto, el nombre de este campo debe siempre terminar en [] como un vector, y ademas debe coincidir con el nombre que se da a los campos nuevos en el script --> <input type="file" name="archivos[]" /><br /> </div></dd> <dt><a href="#" onClick="addCampo()">Subir otro archivo</a></dt> <dd><input type="submit" value="Enviar" id="envia" name="envia" /></dd> </dl> </form>
Ahora vamos con el javascript, este es el corazón de este truco, y se encarga de crear los campos dinamicos:
Código :
<script type="text/javascript"> var numero = 0; //Esta es una variable de control para mantener nombres //diferentes de cada campo creado dinamicamente. evento = function (evt) { //esta funcion nos devuelve el tipo de evento disparado return (!evt) ? event : evt; }
//Aqui se hace lamagia... jejeje, esta funcion crea dinamicamente los nuevos campos file addCampo = function () { //Creamos un nuevo div para que contenga el nuevo campo nDiv = document.createElement('div'); //con esto se establece la clase de la div nDiv.className = 'archivo'; //este es el id de la div, aqui la utilidad de la variable numero //nos permite darle un id unico nDiv.id = 'file' + (++numero); //creamos el input para el formulario: nCampo = document.createElement('input'); //le damos un nombre, es importante que lo nombren como vector, pues todos los campos //compartiran el nombre en un arreglo, asi es mas facil procesar posteriormente con php nCampo.name = 'archivos[]'; //Establecemos el tipo de campo nCampo.type = 'file'; //Ahora creamos un link para poder eliminar un campo que ya no deseemos a = document.createElement('a'); //El link debe tener el mismo nombre de la div padre, para efectos de localizarla y eliminarla a.name = nDiv.id; //Este link no debe ir a ningun lado a.href = '#'; //Establecemos que dispare esta funcion en click a.onclick = elimCamp; //Con esto ponemos el texto del link a.innerHTML = 'Eliminar'; //Bien es el momento de integrar lo que hemos creado al documento, //primero usamos la función appendChild para adicionar el campo file nuevo nDiv.appendChild(nCampo); //Adicionamos el Link nDiv.appendChild(a); //Ahora si recuerdan, en el html hay una div cuyo id es 'adjuntos', bien //con esta función obtenemos una referencia a ella para usar de nuevo appendChild //y adicionar la div que hemos creado, la cual contiene el campo file con su link de eliminación: container = document.getElementById('adjuntos'); container.appendChild(nDiv); } //con esta función eliminamos el campo cuyo link de eliminación sea presionado elimCamp = function (evt){ evt = evento(evt); nCampo = rObj(evt); div = document.getElementById(nCampo.name); div.parentNode.removeChild(div); } //con esta función recuperamos una instancia del objeto que disparo el evento rObj = function (evt) { return evt.srcElement ? evt.srcElement : evt.target; } </script>
Y por ultimo tenemos la contraparte php (upload.php, el destino del formulario), que se encargara de procesar lo que enviemos al servidor, este es solo un pequeño ejemplo de como operar los archivos y hacer lo que necesiten con ellos:
Código :
<?php //Preguntamos si nuetro arreglo 'archivos' fue definido if (isset ($_FILES["archivos"])) { //de se asi, para procesar los archivos subidos al servidor solo debemos recorrerlo //obtenemos la cantidad de elementos que tiene el arreglo archivos $tot = count($_FILES["archivos"]["name"]); //este for recorre el arreglo for ($i = 0; $i < $tot; $i++){ //con el indice $i, poemos obtener la propiedad que desemos de cada archivo //para trabajar con este $tmp_name = $_FILES["archivos"]["tmp_name"][$i]; $name = $_FILES["archivos"]["name"][$i]; echo("<b>Archivo </b> $key "); echo("<br />"); echo("<b>el nombre original:</b> "); echo($name); echo("<br />"); echo("<b>el nombre temporal:</b> \n"); echo($tmp_name); echo("<br />"); } } ?>
Bien con esto es suficiente para que creen los campos dinámicos de upload y los procesen en su servidor, esto es útil cuando no sabemos cuantos serán (como en gmail, jejeje), y otras muchas ocasiones donde necesitamos crear campos dinámicamente. Saludos
Buen tip. No se si solo soy yo, pero el link para eliminar un input no funciona con ie6... Por:pichichi
Muy bueno, util e interesante además adaptable a bastantes usos gracias. Por:Yranac
Bien, saludos ego, para armar esto no hay mayor complicación, cada paso del tip es un archivo, como explico, la primera parte es el html, osea la pagina web por asi decirlo, la segunda es javascript, para esto tienes dos opciones, o bien creas un archivo aparte .js y lo incluyes en el html, o escribes el scrtipt directamente en la cabecera del html, con la etiqueta [bold]<script>[/bold]. y la ultima parte como digo es el archivo [bold]upload.php[/bold], que bien podría llamarse como te guste, solo hay que indicar el nombre correcto en el action de form. Espero que con esto se hayan aclarado tu dudas.
Saludos pichichi, he revisado y.... MALDITO IE....arrgg.. tienes razón... no funciona, voy a revisar por que no se le da la gana de funcionar a este intento de navegador de nuestro amigo B... malditasea.... bueno lo revisare y buscare una solución, cuando la tenga posteare la corrección o de ser posible, sea colocada en el post original, Gracias por avisar. Saludos...
PD. Ya he probado en Opera y funciona ok... Por:EmiR
Bien señores aqui esta la corrección, solo se han realizado cambios en el js, realice unos cambios a la función elimCamp(evt), y cree una nueva llamada rObj(evt), esta ultima se encarga de devolver el evento, de forma que ahora internet explorer también lo entienda y luego podamos acceder a la propiedad name del objeto link, que es siempre el que dispara esa función, y se ha reemplazado el evt.target.name, por que el ie no podía darme esta propiedad directamente como ff y opera si. Bien el código queda así:
Código :
//con esta función eliminamos el campo cuyo link de eliminación sea presionado elimCamp = function (evt){ evt = evento(evt); nCampo = rObj(evt); div = document.getElementById(nCampo.name); div.parentNode.removeChild(div); } //con esta función recuperamos una instancia del objeto que disparo el evento rObj = function (evt) { return evt.srcElement ? evt.srcElement : evt.target; }
Y eso es todo, lo probé en ie6, supongo que debe funcionar igual en el 7... si encuentran otra falla no duden en comentar. Saludos.
PD: Freddie®, seria buena idea editar mi post original y colocar la corrección? o es mejor dejarla aquí? Por:EmiR
Me parece que genial el tip pero tengo el siguiente problema.
subi dos archivos al directorio "reglamentos" para que lo que suba se guarde ahi.
subir_estadistica.php (donde tengo e script y el form) upload.php (donde tengo el codigo php)
el problema es que no me sube nada al servidor me lo ejecuta por que me pone es siguiente texto: Archivo el nombre original: prueba.txt el nombre temporal: /var/tmp/phpW1a4Cu
Lo probe en explorer y firefox y los dos me hace lo mismo pero no me lo sube.
QUE ESTOY HACIENDO MAL?? LO QUE NO HICE NUNCA ES DARLE LA DIRECCION DONDE LLO QUIERO SUBIR, ESO ES NECESARIO?
Bueno esperouna ayuda ya que me sirve muchisimo este formato de formulario.
Gracias de antemano
SAludos
Diego Por:Diego_blog
A mi tampoco me funciona, me pasa lo mismo que a Diego_blog. Sale el texto con los nombres del archivo y el temporal, pero no me lo sube a ninguna carpeta. ¿No sería necesaria por algún sitio la funcion php move_uploaded_file()? Por:Kezern_blog
si, tienen razón, pero el fin del tip era mostrar como hacer subidas múltiples de archivo, utilizando el estilo de gmail, que crea campos dinámicos, y la forma adecuada para poder acceder dichos archivos una vez "subidos" al servidor, en ningún momento dije que iba a enseñar a guardar los archivos en el server..., en el código también deje muy claro que yo no estaba haciendo nada con los archivos subidos al servidor:
Código :
//con el indice $i, podemos obtener la propiedad que deseemos de cada archivo //para trabajar con este
Es en esa sección de código, donde podemos "trabajar con el archivo", es decir copiarlo, editarlo, enviarlo como adjunto por mail... u otras muchas cosas que se desee hacer con los archivos subidos al servidor por este medio, pues como esta el script, todo el proceso que realizamos sobre el archivo es obtener su nombre temporal en el servidor, y el nombre original con el que lo envió el usuario, imprimirlos nombre y ya... por tanto, les dejo de tarea que pongan manos a la obra, encuentren un buen punto del código (que no creo que les sea difícil) donde realizar el trabajo que deseen con sus archivos recién subidos al servidor... (si, "trabajo" en su caso es sinónimo de copiarlos a la ubicación deseada). Vamos... no es complicado, no quise poner un ejemplo completamente funcional, para 'obligarlos' a entender el código, y así pudieran modificarlo para suplir sus necesidades especificas, y de paso aprendieran. Kezern, tienes razón, move_uploaded_file(); es una forma comun para mover los archivos de la carpeta temporal del servidor a una ubicación deseada. lean la documentación de esta función en www.php.net. Saludos. Por:EmiR
lo acabo de bajar este tutorial lo voy ha probar pero viendo el codigo parece que promete muy pronto les doy mi comentario final
gracias Por:luis rojas_blog
hola a todos!!!! necesito su ayuda urgente, no se programar mucho con PHP, pero necesito entregar una tarea, me podrian decir, como le hago para subir un archivo y despues utilizarlo es decir, utilizo el boton para archivo, en mi pagina me sale la palabra examinar y voy a la direccion de ubicacion de mi archivo, lo selecciono, le doy aceptar, pero luego, como le hago para enviarlo al servidor, o para que al momento de darle aceptar, lo pueda visualizar, en otra pagina del explorador, no se si me explique, gracias. Por:FLORECITA_blog
FLORECITA, debes registrarte y exponer tus dudas en los foros para poder obtener respuesta Por:La100rra
Adonde se van los archivos k envia uno, digo por k en el codigo no veo un aparte donde puedas modificar la ruta de llegada como: micorreo@correo.com o algo asi Por:Gilberto Quevedo Casillas
Hola, muy bueno el tip. Pero tengo un problema mayor, en una página necesito proveer de algún medio para subir periodicamente algo asi como 400 archivos. Descartando que se utilice un cliente ftp. He visto por ahi un java applet que muestra un explorador de windows con la info del cliente (escritorio, mi pc, etc.) y que permite seleccionar con un checkbook lo archivos a subir. De todas maneras lo expondre en el foro. Gracias igual por el tema, lo utilizaré en otra web Por:Pablo_blog
Muy bueno el truco. Se puede hacer algo similar pero mas sencillo, con un campo o una lista seleccionar el n° de archivos que se van a subir y luego recargar la pagina una sola vez. En codigo es solo un bucle y un echo en php. Por defecto carga un archivo. Por:dieste_blog
como adaptarlo para otro tipo de campo? me explico campos de texto y dropdown lists
gracias, el script es muy bueno Por:mariobj_blog
Buen tip, mi pregunta es como puedo hacer para que los archivos adjuntos se guarden en una base MySQL Por:Beatriz_blog
Hola el ultimo codigo php en donde lo minserto y una duda donde cambio el destino de los archivos es lo unico que no entiendo gracias Por:Maguano_blog
El ultimo codigo php lo guardas en un archivo llamado "upload.php". Por:Espartacus_blog
muy bueno el foro, como subo el archivo a una carpeta osea le doy a examinar y la subo pero como lo hago con los examminar nuevo q genera el javascript??no se si me explico Por:luisa _blog
hola bueno aqui les va esto lo colocan en la parte del php esto guarda los archivos en una carpeta:
if ($HTTP_POST_FILES["ruta_imagen"]){ $tot = count($_FILES["ruta_imagen"]["name"]); for ($i = 0; $i < $tot; $i ){ $nombre_archivo = "image/" . $HTTP_POST_FILES['ruta_imagen']['name'][$i]; $tipo_archivo = $HTTP_POST_FILES['ruta_imagen']['type'][$i]; $tamano_archivo = $HTTP_POST_FILES['ruta_imagen']['size'][$i]; //compruebo si las características del archivo son las que deseo if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) Por:Engi_blog
//Programador Engi Garcia....// if ($HTTP_POST_FILES["ruta_imagen"]){ $tot = count($_FILES["ruta_imagen"]["name"]); for ($i = 0; $i < $tot; $i ){ $nombre_archivo = "image/" . $HTTP_POST_FILES['ruta_imagen']['name'][$i]; $tipo_archivo = $HTTP_POST_FILES['ruta_imagen']['type'][$i]; $tamano_archivo = $HTTP_POST_FILES['ruta_imagen']['size'][$i]; //compruebo si las características del archivo son las que deseo if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) Por:Engi_blog
if (!((strpos($tipo_archivo, "gif") || strpos($tipo_archivo, "jpeg")) Por:Engi_blog
upsss lo siento no pude ingresar el script completo el q lo necesite me avisa por medio de este foro bye q estes bien....Engi Por:Engi_blog
mmm me seria de gran utilidad tener todo no se si lo tienes colgado un zip de los archivos en alguna parte. Gracias Engi_blog Por:cyper_blog
¿Con que navegadores funciona ese JavaScript? Por:Andrés_blog
Wenas tengo unas dudas: Lo del php sonde se pone en upload.php o en la página en la que pongo el formulario y el javascript??. Otra pregunta: como puedo hacer para que lo archivos se envien al ftp??, y como despues puedo descargarmelos???. Espero que no sea tanta molestia reponder todo y gracias anticipadas Por:Pedromi_blog
esta sueper el foro gracias por todo m a ayudado mucho Por:Andy_blog
como puedo hacer para agregar campos con un boton yo tengo que ingresar datos pero no puedo poner todos los campos de texto como puedo hacer para agregar esos campoa a medida que los tenga que usar con un boton si pueden explicar eso por favor Por:carlos_blog
Está muy bueno el "truco". Mis felicitaciones por lo ingenioso. He estado jugando con eso de agregar campos a formularios dinámicamente y me han salido cosas muy interesantes, el JavaScript no es lo mío aún. Ahora para el tema de encontrar los archivos subidos al servidor lo que se debe hacer luego de corroborar que el archivo subido por el usuario está en el directorio temporal del servidor es moverlo de allí a alguna parte de nuestro directorio home. Todo esto se hace con PHP. Voy a suponer que queremos mover los archivo al sirectorio "subidos" de nuestro home. A continuación de haberse establecido el valor de las variables $tmp_name y $name y estando dentro del ciclo "for" agregar...
Código :
$newfile = "subidos/".$name; if (is_uploaded_file($tmp_name)) { if (!copy($tmp_name,"$newfile")) { print "Error en transferencia de archivo."; exit(); } // if copy } // if is_up...
Y eso es todo. Este código acepta cualquier archivo, en el caso que quiéramos restringir a algún tipo de archivo en particular (es MUY MALA IDEA dejar que suban archivos con extensión .php) les dejo una forma simple de saber la extensión del archivo:
pero en esto de los archivos me interesaria saber como se puede subir un archivo sin tener que explorarlo, solo con la ruta completa del fichero por ejemplo "c:\documento.doc" todo en el php.
se puede ? gracias Por:juan_blog
Por favor quisiera saber como crear albumes de fotos dinámicos gracias lo necesito para mi proyecto de grado en php Por:Andres_blog
hola oigan yo he podido hacer que aparezca un input dinámicamente como lo indican en sus ejemplos, pero que pasa si quisiera agregar 3 o 4 inputs al hacer clic en añadir, por ejemplo que esté el campo del archivo, su nombre, una pekeña descripción y cuando le den clic en agregar otro vuelvan a aparecer estos 3 campos y así sucesivamente = para borrarlos. Ojalá alguien me pueda ayudar Gracias, Saludos. Por:John_blog
Excelente script funciona de maravilla, lo digo por que pude arreglar los errorsitos que tienes pero es lo de menos funciona bien Por:CreationsDvd.com
Implemente este estupendo script y funciona de maravilla con las correcciones de los demás usuarios pero no me suben archivos arriba de 2 megas como puedo hacer?? Por:cayo_blog
Cayo_blog>>> Eso tendrias que ver tu configuracion del apache Por:CreationsDvd.com_blog
hola solo sube un archivo el del primer file Por:diana_blog
el problema es en firefox ... no sirve el javascript ... en IE6 si sirve Por:diana_blog
Hola, muchas gracias por el código, me resultó muy útil. Pero ahora quisiera saber cómo puedo hacer para modificarlo para que en vez de subir imagenes sean cuadros de texto y que cada dato ingresado se guarde en un arreglo al presionar la tecla ENVIAR. En sintesis, necesito realizar algo muy similar pero con cuadros de textos y guardar sus valores en un arreglo que mostraré.
Muchas gracias y disculpen las molestias Por:Rast_blog
Seria bueno poder tener un pagina para que las correcciones se fueran probando. Por:Manel_blog
Hay funciones estandar para manipular archivos en php. Ingresen esta busqueda en google y veran que hay muchas formas de hacer las cosas..., una de ellas es usando librerías estandar de php
if (move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $nombre_archivo)){ echo "Yahoo!!!."; }else{ echo "Oops!!!"; } Por:mrsmock_blog
me envian el codigo para cambiar los archivos de carpeta porfas mackk01@hotmail.com Por:Hola_blog
Que tal necesito saber si alguien tiene el codigo completo para mover los archivos a otra carpeta Por:Cesar_blog
chamo alguien seria tan amable de hacerme todo eso en mi pc yo le doy el permiso porfavor Por:danielorlando_blog
Excelente, una parte del código javascript me sirvió para resolver lo que no pude con PHP.La pregunta es: como hago para acceder a cada uno de los campos agregados dinámicamente (campos texto) con javascript, ya probé con form.elements[algún valor].value y con form.ingredientes[algún valor].value donde ingredientes es el nombre del campo (<input type=text name="ingredientes[]".....> Por:Sebastian _blog
Alguien me puede pasar todo comprimido de manera que pueda subir todo tipo de archivos Por:Oscar_blog
Tengo una duda: Ya utilicé el codigo y me adjunta excelente, pero ahora quiero buscarlos. Cómo hago???' Por:HOOVER_blog
Hola! Mi problema es que en Firefox me funciona perfectamente, pero en IE 7 no hace absolutamente nada al pinchar en "Subir archivos" No aparece el nuevo campo. Lo he solucionado instalando Firefox en la oficina en la que van a hacer funcionar la subida, pero me gustaria que funcionara también en IE7
Gracias Por:Miquel_blog
elimCamp = function (evt){ evt = evento(evt); /* aki estama la llamada mal : nCampo = rObj(evt); no es esto es asi=> */ nCampo = eventorObj(evt); div = document.getElementById(nCampo.name); div.parentNode.removeChild(div); } Por:CUIDADOOOO