Foros del Web » Programando para Internet » Javascript »

enviar ajax cada por cada archivo en un solo input (html5 input multuple)

Estas en el tema de enviar ajax cada por cada archivo en un solo input (html5 input multuple) en el foro de Javascript en Foros del Web. Hola chicos hoy voy a hacer una pregunta que es nueva para la mayoria y es sobre la forma de enviar archivos con javascript con ...
  #1 (permalink)  
Antiguo 16/07/2013, 16:38
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 4 meses
Puntos: 2
enviar ajax cada por cada archivo en un solo input (html5 input multuple)

Hola chicos hoy voy a hacer una pregunta que es nueva para la mayoria y es sobre la forma de enviar archivos con javascript con el objeto FormData.

Bueno mi pregunta es la siguiente:

yo hice un foreach en javascript que lo que hace es recorrer por cada uno de los archivos que el usuario a insertado en un input file multiple.
por cada uno de los archivos envie un array los inserto en un FormData y los envio. Pues el problema es que no se como limpiar el formdata ya que cada vez que se recorre el archivo esta variable guarda el siguiente pero tambien el aterior y cada vez va creciendo y asi no me sirve.

codigo:

Código Javascript:
Ver original
  1. if(window.FormData){ //valida si el explorador puede trabajar con el Formdata
  2.         formdata = new FormData();
  3.         //document.getElementById('btnSubmit').style.display = 'none';
  4.     }
  5.  
  6. if(button.addEventListener){
  7.         button.addEventListener('click', function(evt){ // escucha cuando le da click a un boton
  8.             var i = 0, len = input.files.length, img, reader, file; // las variables
  9.            
  10.             document.getElementById('response').innerHTML = 'Subiendo...';
  11.            
  12.             //Si hay varias imágenes, las obtenemos una a una
  13.             for( ; i < len; i++){ //  hago un foreach por cada archivo que tenga el input dentro acordemos que es HTML5
  14.                 file = input.files[i];
  15.                 //console.log(file);
  16.                 //Una pequeña validación para subir imágenes
  17.                 if(!!file.type.match(/image.*/)){
  18.                     //Si el navegador soporta el objeto FileReader
  19.                     /*if(window.FileReader){
  20.                         reader = new FileReader();
  21.                         //Llamamos a este evento cuando la lectura del archivo es completa
  22.                         //Después agregamos la imagen en una lista
  23.                         reader.onloadend = function(e){
  24.                             mostrarImagenSubida(e.target.result); // funcion que muestra la imagen antes de subirla al servidor
  25.                         };
  26. //                        //Comienza a leer el archivo
  27. //                        //Cuando termina el evento onloadend es llamado
  28.                         reader.readAsDataURL(file);
  29.                     }*/
  30.                    
  31. //                    Si existe una instancia de FormData
  32.                     if(formdata)
  33.                         //Usamos el método append, cuyos parámetros son:
  34.                             //name : El nombre del campo
  35.                             //value: El valor del campo (puede ser de tipo Blob, File e incluso string)
  36.                         formdata.append('images[]', file); // aqui es donde le asigno al formdata los archivos
  37.                         //console.log(file);
  38.                         //formdata='cod='+i+'&'+formdata;
  39.                         var hola=envio(formdata);
  40.                         if(hola){
  41.                             console.log('ok'); // valido si envio limpio el formdata
  42.                         }else{
  43.                             console.log('error'); // no envio no limpia
  44.                         }
  45.                 }
  46.             }          
  47.         });
  48.     }
  49. }());
  50.  
  51. function envio(form){ // funcion que envia datos pero pues aqui no creo que importe
  52.     var reto;
  53.      if(form){
  54.         $.ajax({
  55.            url : 'upload.php',
  56.            type : 'POST',
  57.            data : form,
  58.            processData : false,
  59.            contentType : false,
  60.            success : function(res){
  61.                document.getElementById('response').innerHTML = res;
  62.                reto=true;
  63.            }
  64.         });
  65.     }
  66.     reto=false;
  67. }

tengo un archivo php que lee los archivos y puse un echo que me muestra los nombre de los archivos y me sale asi

/*****************

ciclo 1:

jaja.jpg

ciclo2:

jaja.jpg
mañana.png

ciclo 3:

jaja.jpg
mañana.png
forever.jpg

ciclo 4:

jaja-jpg
mañana.png
forever.jpg
hello.jpg


si se dan de cuenta se envia si la cntidad de archivco que hay dentro del input pero lo que se envia cada vez se incrementa y pues asi no me sirve por que sino cada vez se pone mas pesado el envio y se malgasta recursos entonces nooo

la cosa es como hago para limpiar el formdata y como hago la funcion que valida si se envio el dato en este caso el archivo por que no se todabia como hacer?

gracias de antemano por la atencion chicos :D

/*****************
  #2 (permalink)  
Antiguo 17/07/2013, 10:41
3nr1c
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: enviar ajax cada por cada archivo en un solo input (html5 input multuple)

Saludos,

Lo que tendrías que hacer es crear un formdata nuevo cada vez, es decir
Código Javascript:
Ver original
  1. if(!!file.type.match(/image.*/)){
  2.  
  3.                        if(window.FormData){ //valida si el explorador puede trabajar con el Formdata
  4.                               formdata = new FormData();
  5.                        }
  6.  
  7.                         //Usamos el método append, cuyos parámetros son:
  8.                             //name : El nombre del campo
  9.                             //value: El valor del campo (puede ser de tipo Blob, File e incluso string)
  10.                         formdata.append('images[]', file); // aqui es donde le asigno al formdata los archivos
  11.                         //console.log(file);
  12.                         //formdata='cod='+i+'&'+formdata;
  13.                         var hola=envio(formdata);
  14.                         if(hola){
  15.                             console.log('ok'); // valido si envio limpio el formdata
  16.                         }else{
  17.                             console.log('error'); // no envio no limpia
  18.                         }
  19.                 }

Aunque para enviar archivos yo no te recomendaría Formdata sino más bien XMLHTTPRequest2: http://www.enricflorit.com/como-subi...s-usando-ajax/

Un saludo!
  #3 (permalink)  
Antiguo 17/07/2013, 12:33
Avatar de sonickseven  
Fecha de Ingreso: diciembre-2012
Ubicación: bogota
Mensajes: 404
Antigüedad: 11 años, 4 meses
Puntos: 2
Respuesta: enviar ajax cada por cada archivo en un solo input (html5 input multuple)

ya lo solucione y es facil :D amm por cierto si es necesario el formadata ya que es el que envia archivos de forma asincronoma....

Ahora el lio es como saber que envio seria algo asi con el objeto XMLHTTPReques2 en la parte de envio se completa para enviar uno por uno..como ves en la función envio lo trato de hacer en la parte del success:
pero no me funciona bn por que lo que hace es enviar toda la cantidad de POST que hay entonces cree la siguiente funcion que es similar a la de envio solo que es por javascript con el metodo XMLHTTPReques aqui el codigo:

Código Javascript:
Ver original
  1. function envio3(datos){
  2.     var oReq=new XMLHttpRequest();
  3.     oReq.upload.addEventListener('progress', prigress, false);
  4.     oReq.open('POST', 'upload.php', true);
  5.     oReq.onreadystatechange = function(){ if(this.readyState===4){
  6.         return true;
  7.     }else{
  8.         return false;
  9.     }
  10.     }  
  11.     oReq.send(datos);
  12. }
lo hize de esta forma pero no me ha funcionado ya que cuando le asigno esta funcion a un dato me dice que undefined
Código Javascript:
Ver original
  1. var hola=envio3(formdata);
  2.                         console.log(hola);

tonces modifique la funcion de nuevo haber que tal me hiba
Código Javascript:
Ver original
  1. function envio3(datos){
  2.     var oReq=new XMLHttpRequest(), retor;
  3.     oReq.upload.addEventListener('progress', prigress, false);
  4.     oReq.open('POST', 'upload.php', true);
  5.     oReq.onreadystatechange = function(){ if(this.readyState===4){
  6.         retor=true;
  7.     }else{
  8.         retor=false;
  9.     }
  10.     }
  11.     oReq.send(datos);
  12.      return retor;
  13. }

y ensaye pero lo mismo dice que esta indefinida tonces no se que hacer?

Lo que quiero es que por ejemplo envio un dato y si ese dato ya se termino de enviar ahora envie el otro y asi sucesivamente por que del modo que lo tengo no lo hace y es lo miso que veo en el block que me enviaste donde mostraba como subir archivo multiples :D

voya seguir intentando

Etiquetas: ajax, cada, funcion, html, html5, input, php, variable
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 01:26.