Foros del Web » Programando para Internet » Javascript » Frameworks JS »

subir archivos al servidor con ajax

Estas en el tema de subir archivos al servidor con ajax en el foro de Frameworks JS en Foros del Web. Tengo una duda que a ver si me la resolveis o me orientais un poco. ¿Un input type file de un formulario se puede enviar ...
  #1 (permalink)  
Antiguo 12/02/2010, 03:08
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
subir archivos al servidor con ajax

Tengo una duda que a ver si me la resolveis o me orientais un poco.

¿Un input type file de un formulario se puede enviar a traves de ajax a una pagina php que lo suba al servidor, y despues muestre un mensaje de "archivo guardado" en la pagina del formulario sin recargar esta pagina?

Porque he estado probando, y con campos de texto si que me deja pero con un input type file no.

Para solucionar esto he visto que se carga el mensaje un un iframe o algo así, pero ¿Se recarga la pagina, porque si es así no me vale?

Espero vuestras opiniones.Gracias
  #2 (permalink)  
Antiguo 12/02/2010, 03:29
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Respuesta: subir archivos al servidor con ajax

Hola luicos, bienvenido a los foros :

En las FAQs puse la respuesta, y es "no se puede", al menos con un objeto Ajax (ya sabes, XMLHttpRequest), ya que no acepta la cabecera multipart/form-data, que es lo que se usa con los campos file... además, los datos del contenido del fichero tampoco lo podrías obtener, ya que los envíos son del tipo variable=contenido, y la parte del contenido del fichero es imposible obtenerlo por razones de seguridad...

Los sistemas que simulan Ajax, usan un iframe oculto (o disimilado), y un formulario clásico de envío con adjuntos, y al enviarse a un iframe, lo único que se recarga es el ídem.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 12/02/2010, 04:45
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: subir archivos al servidor con ajax

Es que yo lo que quiero hacer es una pagina que tenga varios formularios, y que se pueda interactuar con ellos de forma independiente, es decir, que solo me recarge una parte y no toda la pagina.

Te explico, tengo un combobox que carga nombres y apellidos de una base de datos, y al escoger uno me carga todos sus datos en una tabla. Esto lo hago con ajax.

Pero mas abajo tengo un formulario que me permite adjuntar un archivo con type file, luego lo subo al servidor y guardo la ruta en otra tabla independiente de la de usuarios.

Lo que pretendia era adjuntar el archivo a traves de este formulario y que me sacase un mensaje de "archivo guardado" debajo del formulario pero sin que recargase toda la pagina, porque si tengo en el combo de arriba seleccionado un usuario, no me lo puede cambiar.

¿Como puedo hacer esto? Es que si no lo puedo hacer así, mi proyecto se me va a complicar.

Adjunto enlace de como se podría hacer para que me digais si es correcto.
http://cabezaderaton.com.ar/ajax-file-upload/
Gracias
  #4 (permalink)  
Antiguo 12/02/2010, 10:48
Avatar de hector2c  
Fecha de Ingreso: noviembre-2007
Ubicación: Perú - Tacna
Mensajes: 979
Antigüedad: 17 años
Puntos: 25
Respuesta: subir archivos al servidor con ajax

se puede subir ficheros mediante ajax, con jquery y el plugin AjaxFileUpload-Demo, lo uso desde hace mucho, y me va muy bien...
__________________
blog: hector2c.wordpress.com
email: [email protected]
  #5 (permalink)  
Antiguo 12/02/2010, 12:47
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Respuesta: subir archivos al servidor con ajax

Cita:
Iniciado por hector2c Ver Mensaje
se puede subir ficheros mediante ajax, con jquery y el plugin AjaxFileUpload-Demo, lo uso desde hace mucho, y me va muy bien...
Hola:

Todas las librerías tienen rutinas para subir ficheros, y aunque dicen que usan Ajax, tal como dije antes, usan un iframe oculto...

... además, no es necesario cargar una librería completa para subir archivos...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #6 (permalink)  
Antiguo 13/02/2010, 08:23
Avatar de hschimpf  
Fecha de Ingreso: junio-2009
Ubicación: in the World Wide Web
Mensajes: 140
Antigüedad: 15 años, 6 meses
Puntos: 17
De acuerdo Respuesta: subir archivos al servidor con ajax

Cita:
Iniciado por luicos Ver Mensaje
Lo que pretendia era adjuntar el archivo a traves de este formulario y que me sacase un mensaje de "archivo guardado" debajo del formulario pero sin que recargase toda la pagina, ...
Mira luicos, lo que puedes realizar es, como ya te han comentado, en tu formulario que deseas agregar el <input type='file'>, colocar este en un iframe de la siguiente manera:
Código HTML:
Ver original
  1. ...
  2. <IFRAME id='frameArchivo'>
  3.    <FORM action='fichero.php' method='POST' enctype='multipart/form-data' id='formArchivo'>
  4.       <INPUT type='hidden' name='codCombo' id='codCombo'>
  5.       <INPUT type='file' name='archivo'
  6.   </FORM>
  7. <DIV id='mensajeResultado'></DIV>
El campo hidden es para que almacenes el codigo del combo ya que de alguna forma debes identificar para que registro es el fichero que estas subiendo. El DIV debajo del frame es donde se mostraran los mensajes.
Tu archivo PHP luego de procesar el fichero subido deberia tener una linea como esta para mostrar el mensaje:
Código PHP:
Ver original
  1. ...
  2. echo '<SCRIPT languaje=\'javascript\'>parent.getElementById("mensajeResultado").innerHTML = "Mensaje a mostrar..";</SCRIPT>';
  3. ...
Yo realice ese procedimiento para un sistema que desarrolle. Si lo quieres probar esta en http://alquiler.gschimpf.com. Debes registrarte como usuario nuevo y crear un anuncio.
Cualquier consulta es bienvenida.
Suerte!
  #7 (permalink)  
Antiguo 13/02/2010, 09:03
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Respuesta: subir archivos al servidor con ajax

Cita:
Iniciado por hschimpf Ver Mensaje
Mira luicos, lo que puedes realizar es, como ya te han comentado, en tu formulario que deseas agregar el <input type='file'>, colocar este en un iframe de la siguiente manera:
...
<IFRAME id='frameArchivo'>
<FORM action='fichero.php' method='POST' enctype='multipart/form-data' id='formArchivo'>
<INPUT type='hidden' name='codCombo' id='codCombo'>
<INPUT type='file' name='archivo'
</FORM>
</IFRAME>
...
Hola:

Dentro de un iframe, no se puede poner nada... ¿En qué navegador has probado/usado ese código...?

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #8 (permalink)  
Antiguo 13/02/2010, 09:27
Avatar de hschimpf  
Fecha de Ingreso: junio-2009
Ubicación: in the World Wide Web
Mensajes: 140
Antigüedad: 15 años, 6 meses
Puntos: 17
De acuerdo Respuesta: subir archivos al servidor con ajax

Cita:
Iniciado por caricatos Ver Mensaje
Dentro de un iframe, no se puede poner nada... ¿En qué navegador has probado/usado ese código...?
Perdon, tienes razon. Escribi el codigo de lo que me acordaba. Ahora revise el sistema y es asi como lo hice:
Código HTML:
Ver original
  1. <FORM action='fichero.php' method='POST' enctype='multipart/form-data' id='formArchivo' target='iframeUpload'>
  2.    <INPUT type='hidden' name='codCombo' id='codCombo'>
  3.    <INPUT type='file' name='archivo'>
  4. </FORM>
  5. <IFRAME id='iframeUpload' name='iframeUpload' style='display: none;'></IFRAME>
  6. <DIV id='mensajeResultado'></DIV>
Luego desde javascript envio el formulario:
Código Javascript:
Ver original
  1. document.getElementById('fomrArchivo').submit();
Gracias por la observacion!
  #9 (permalink)  
Antiguo 13/02/2010, 13:24
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: subir archivos al servidor con ajax

Gracias por vuestros apoyos. Para ser nuevo en el foro no me puedo quejar de la ayuda prestada.

Voy a hacer pruebas y luego ya os comento

Un saludo
  #10 (permalink)  
Antiguo 14/02/2010, 07:59
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: subir archivos al servidor con ajax

Hola de nuevo, he probado el codigo y no me funciona
en el formulario tengo esto:
Código HTML:
<form action="php_plantillas.php" method="post" enctype="multipart/form-data" id="frplantilla" target="iframeUpload">													
<img src="http://www.forosdelweb.com/f77/Images/eng.png" border=0 align="absbottom"></img>&nbsp;
<font size="1"><u><b>ENGADIR PLANTILLA A TIPOS DE PROBAS</b></u>
<p>									
<b>• Plantilla:</b> <input type="file" name="plantilla">													
<p>
<div>
<input  type="submit" name="engadir" value="Engadir">
</div>
</font>
</form>
<iframe id="iframeUpload" name="iframeUpload" style="display:none;"></iframe>
<div id="mensajeResultado"></div> 
y en el php tengo esto:

Código PHP:
<?php
    
if ($_FILES 'plantilla' ][ 'name' ] != ''
        {    
            
//COMPROBAR SI EXISTE ESE NOMBRE EN LA BD
            
$stado false;
            include 
"../conexion.php";                                            
            
$sql4="SELECT nomeplantilla FROM plantillaspsic";
              
$result4=mysql_query($sql4,$conexion) or die(mysql_error());
            
$minusculas strtolower($_FILES 'plantilla' ][ 'name' ]);
            while (
$row mysql_fetch_row($result4))
                {
                    if (
utf8_decode($row[0]) == $minusculas)
                        {    
                        
$stado true;                                                                                                                                                                    
                        }
                }
                                                                
            if (
$stado == true)
                {
                    include 
"../cerrar_conexion.php";
                    echo 
"<script languaje='Javascript'>
                    parent.getElementById('mensajeResultado').innerHTML = 'Este nombre de plantilla ya existe en la B.D.';</script>"
;                    
                }
            else
                {                                                        
                    
/////////////////////////////////////////////////////////////
                    // SUBIR PLANTILLA PRUEBAS PSICO al SERVIDOR ///////
                    /////////////////////////////////////////////////////////////
                    
$destinoplant 'plantillas_ps';                                                                   
                    
$archivosin str_replace(" """$minusculas);                                                                                                                                                                                            
                    
move_uploaded_file $_FILES 'plantilla' ][ 'tmp_name' ], $destinoplant '/' $archivosin );                                                                                    
                    
// $rutap-> variable donde se almacena la ruta para guardar en MYSQL
                    
$rutap $destinoplant '/' $minusculas;
                    
$rutapsin str_replace(" """$rutap); // quitar espacios en blanco
                    
$rutapsin2=utf8_encode($rutapsin);                                                                    
                    
$nomep utf8_encode($minusculas);
                    
////////////////////////////// La BD ya está abierta                                                                                                                  
                    
$sql5=" INSERT INTO plantillaspsic (nomeplantilla, rutaplantilla) VALUES ('$nomep','$rutapsin2') ";
                      
$result5=mysql_query($sql5,$conexion) or die(mysql_error());                
                    include 
"../cerrar_conexion.php";    
                    echo 
"<script languaje='Javascript'>
                    parent.getElementById('mensajeResultado').innerHTML = 'Plantilla guardada en la B.D.';</script>"
;                }                                                                        
        }                                                                
?>
¿Que es lo que está pasando, porque no me muestra ningun resultado?
Parece como si no recibiera el valor del input type file
¿Que opinais?
  #11 (permalink)  
Antiguo 14/02/2010, 15:32
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Respuesta: subir archivos al servidor con ajax

Hola:

Mira este artículo; Revisar las imágenes antes de subirlas, es sobre un tema muy recurrente, y muy parecido al que planteas, pero con imágenes.

Los pasos son estos... un formulario con los parámetros que ya tienes (target, enctype y method), luego el iframe que también tienes, pero en el iframe creo que no lo planteas como un documernto html, y así tal vez no se devuelvan bien los resultados...

Otra cosa importante es que parent es un objeto del tipo window, y getElementById es un método del objeto document...

<html>
<body onload="parent.document.getElementById(...)"

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #12 (permalink)  
Antiguo 15/02/2010, 12:00
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: subir archivos al servidor con ajax

¿A que te refieres con que el iframe no lo planteo como un documento html?
No podías ser un poco más concreto, es que no controlo mucho de ajax y no se que cambiar en el codigo.

¿Tengo que poner en la pagina php las etiquetas de html o que?¿Y que es eso del onload, un ejemplo?
NOTA: La pagina en la que tengo el formulario es php, porque tiene codigo php que utilizo para otras cosas y no la puedo poner html, si es eso lo que me quieres decir

Saludos
  #13 (permalink)  
Antiguo 15/02/2010, 12:27
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Respuesta: subir archivos al servidor con ajax

Hola:

¡Exacto!... como no usas un objeto Ajax, no se programa el evento readystate, y para recibir la conformación, hay que usar javascript en el iframe... o sea poner lo mínimo...
<html>
<body onload="parent.alert('Ok')" ></body>
</html>

Claro que una alerta se puede hacer también desde el mismo iframe, pero normalmente hay que hacer algunos ajuistes adicionales...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #14 (permalink)  
Antiguo 15/02/2010, 14:21
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
De acuerdo Respuesta: subir archivos al servidor con ajax

Ya he conseguido que me funcione. El problema estaba en el
Código:
parent.document.getElementById ('mensaje')
, que resulta que no le pusiera el documente entre parent y getElementById.

Despistes, que le vamos a hacer,

Mira caricatos, una ultima cuestion. ¿como puedo hacer para adornarlo con un cargando... + gif animado, mientras no me saca el mensaje?

Ahh... Este método de iframes se puede aplicar tambien a elementos de un formulario tales como campos de texto, text areas, combos y listas. Es decir, se pueden enviar datos a una pagina php, y devolver un mensaje a la pagina del formulario sin recargarla en su totalidad??
  #15 (permalink)  
Antiguo 15/02/2010, 14:35
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Respuesta: subir archivos al servidor con ajax

Hola:

Me alegro que alfin lo arreglaras... y la respuesta de usar el sistema con otras cosas como textos y elementos de formularios, si que es cierto, pero también con los objetoss Ajax normales, y de esa manera, por ejemplo, puedes validar en dtd estricto (tal vez eso no te importa... la verdad es que ami tampoco me han importado nunca...)

Y sobre lo de "cargando..." es relativamente fácil, aunque yo prefiero un gif animado... tenerlo oculto, al enviar el form mostrarlo, y con la respuesta volverlo a ocultar... te propongo que lo intentes. Seguro que lo consigues...

Por cierto, en el artículo que te puse, hay un enlace de ejemplo... ese mismo fichero terminado en php tiene ese efecto: Formulario (chequeo de imágenes)


Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #16 (permalink)  
Antiguo 16/02/2010, 07:39
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: subir archivos al servidor con ajax

Hola caricatos. No he conseguido crear el gif animado.Es que el javascript no lo controlo
¿Me pregunto si me puedes indicar el codigo que tengo que poner, explicado claro, si no es mucha molestia?

Gracias
  #17 (permalink)  
Antiguo 16/02/2010, 13:13
 
Fecha de Ingreso: enero-2005
Mensajes: 122
Antigüedad: 19 años, 10 meses
Puntos: 2
Respuesta: subir archivos al servidor con ajax

Hola luicos

He venido leyendo el post, y te puedo dar una solucion que la he venido haciendo por mucho tiempo para hacer lo que quieres.

Cuando le das al boton para que envie el archivo, podrias hacer esto:

en el HTML
Código HTML:
<input  type="button" name="engadir" onclick="subirArchivo()" value="Engadir"> 
haces una funcion javascript entre las etiquetas HEAD
Código HTML:
function subirArchivo(){
    document.getElementById('mensajeResultado').innerHTML = '<center><img src="imagen_cargando.gif" border="0" /></center>';
    document.getElementById('frplantilla').submit();
}
Lo que esto hace es que cuando le das click a tu boton, el atributo "innerHTML" le inserta dentro del div "mensajeResultado" la imagen de cargando, seguido del envio de la imagen al servidor, cuando se ha subido y todo ha salido ok, haces un echo con 'Plantilla guardada en la B.D.' y ahi le dices de nuevo que ese mensaje lo ponga dentro del div "mensajeResultado" con el atributo "innerHTML" lo que te reemplazaria la imagen de cargando que le habias puesto por tu mensaje.
Asi con esto mientras la imagen esta subiendo esta la imagen de cargando y cuando sube el archivo sale tu mensaje, todo esto en tiempo real.

Espero que te sirva.
  #18 (permalink)  
Antiguo 16/02/2010, 13:25
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: subir archivos al servidor con ajax

Voy a probarlo, lo que pasa es que en el formulario el boton no es un button sino un submit
Será lo mismo no?
  #19 (permalink)  
Antiguo 16/02/2010, 14:09
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: subir archivos al servidor con ajax

Genial, esto me funciona, pero hay un problema y es la validación.
La validacion la tengo asi: onsubmit= "return validacion(this)", y aqui lo que me hace es validar, luego me saca el mensaje de alert, con el gif visualizado, y al aceptar el alert me guarda un archivo de formato diferente al que quiero subir, porque el la funcion subirArchivo(), tengo despues del gif el submit para enviar el formulario.

¿Que solucion tengo aquí?
  #20 (permalink)  
Antiguo 17/02/2010, 03:23
Avatar de luicos  
Fecha de Ingreso: febrero-2010
Ubicación: Galicia
Mensajes: 106
Antigüedad: 14 años, 10 meses
Puntos: 0
De acuerdo Respuesta: subir archivos al servidor con ajax

Ya lo he solucionado. Solo hay que quitar el document.getElementById('frplantilla').submit(); de la funcion subirArchivo() y ya no envia.

En lugar del button tengo un submit en el formulario, que es el que envia

Gracias a todos por vuestra colaboracion y ayuda

Saludos y hasta otra
  #21 (permalink)  
Antiguo 16/03/2010, 09:35
 
Fecha de Ingreso: octubre-2009
Mensajes: 2
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: subir archivos al servidor con ajax

Hola a todos estoy presentando el mismo problema no se como subir imagenes al servidor usado ajax, necesito ayuda urgente

Etiquetas: ajax, subir, servidores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:14.