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

Procesamiento de archivos locales con AJAX

Estas en el tema de Procesamiento de archivos locales con AJAX en el foro de Frameworks JS en Foros del Web. Hola a todos Tengo algún tiempo trabajando con PHP y AJAX pero no he podido resolver este inconveniente. El problema es el siguiente: "Procesar un ...
  #1 (permalink)  
Antiguo 01/10/2008, 15:08
 
Fecha de Ingreso: octubre-2008
Mensajes: 1
Antigüedad: 15 años, 6 meses
Puntos: 0
Pregunta Procesamiento de archivos locales con AJAX

Hola a todos
Tengo algún tiempo trabajando con PHP y AJAX pero no he podido resolver este inconveniente. El problema es el siguiente:
"Procesar un conjunto de archivos con PHP guardados localmente usando AJAX".
Para ello he hecho lo siguiente:
Leer a punta de Javascript archivos almacenados localmente, los archivos tienen la siguiente estructura: W[entero desde 0 hasta cierto valor]P[entero desde 0 hasta cierto valor].RSM. Por ejemplo: W0P0.RSM , W0P1 , W0P2 , W0P3..... W0P1600 luego W1P0, W1P1, W1P2..... W1P1600 (esto se obtiene fácil con dos ciclos for).
La lectura se hace por el momento con un control ActiveX, luego tomo el contenido del archivo por una variable.

Código:
function nuevoAjax()
{ 
	/* Crea el objeto AJAX. Esta funcion es generica para cualquier utilidad de este tipo, por
	lo que se puede copiar tal como esta aqui */
	var xmlhttp=false;
	try
	{
		// Creacion del objeto AJAX para navegadores no IE
		xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
	}
	catch(e)
	{
		try
		{
			// Creacion del objet AJAX para IE
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(E)
		{
			if (!xmlhttp && typeof XMLHttpRequest!='undefined') xmlhttp=new XMLHttpRequest();
		}
	}
	return xmlhttp; 
}

function ReadFile(target)
{	BRateMin=Number(document.formulario.txMinFondo.value);
	BRateMax=Number(document.formulario.txMaxFondo.value);
	URateMin=Number(document.formulario.txMinCSuperior.value);
	URateMax=Number(document.formulario.txMaxCSuperior.value);
	BStep=Number(document.formulario.txIncrementoFondo.value);
	UStep=Number(document.formulario.txIncrementoCSuperior.value);	
	BRateStep= Number((BRateMax - BRateMin) / BStep); 
	URateStep= Number((URateMax - URateMin) / UStep);
	var fso, strArchivo;
	ForReading = 1;
	Ruta= "D:\\Docs\\proyectos\\pruebas\\dataRSM\\";		
	fso = new ActiveXObject("Scripting.FileSystemObject");
	ajax = nuevoAjax();
	divObj= document.getElementById(target);
	divObj.innerHTML="Hora comienzo: "+Date()+"<br>";
	for(i=BRateMin; i<=BRateMax; i+=BRateStep){ 
		for(j=URateMin; j<=URateMax; j+=URateStep){				
			f = fso.OpenTextFile(Ruta+"W"+ i +"P"+ i +".RSM", ForReading);
			strArchivo=f.ReadAll();
			ajax.open("POST", "pruebalectura.php?accion=leerarchivo", true);
			ajax.onreadystatechange=function() 
			{ 
				if (ajax.readyState==1)				
					divObj.innerHTML+="Cargando...<br>";
				
				if (ajax.readyState==4)
				{				
					//Procesamiento AJAX de lectura de archivo
					resultLectura = ajax.responseText; 
					if(resultLectura=='0'){ 
						divObj.innerHTML+="Fallido...<br>"; 
						return 0;					
					}
					else{ 
						divObj.innerHTML+="Exito...Archivo: W"+ i +"P"+ i +".RSM" +" leído por PHP<br>"
						divObj.innerHTML+="Archivo leído?: "+resultLectura;
						f.Close();
					}
						
				}
			}
			ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			ajax.send("strArchivo="+strArchivo);	
		}
	}
}
por otro lado tengo el PHP que genera la respuesta: pruebalectura.php

Código PHP:
    include("../lib/procesadorRSM.php");
    if(isset(
$_POST["strArchivo"]) && !empty($_POST["strArchivo"])){
        
//Pasos para leer el archivo, blah blah blah
        
if(procesarArchivo($_POST["strArchivo"]))
            echo 
"1";    //Exito
        
else
            echo 
"0";    //no se pudo procesar
    

los detalles de la función "procesarArchivo" no es necesario colocarlos acá, solo les digo que lo he probado y está bien.

Lo que está sucediendo es que cuando mando a ejecutar Readfile y se mete en los ciclos FOR se pone a leer los archivos, luego paso al procesamiento con AJAX pero este procesamiento puede tarda un poco, sin embargo, el ciclo FOR debe continuar y no deja que la funcionalidad AJAX se ejecute (se limita a mostrar Cargando..), por consiguiente lo que estoy obteniendo como salida es:
Código HTML:
.
.
.
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Cargando...
Exito...Archivo: W4100P4100.RSM leído
Archivo leído?: 1
Allí solo se está procesando el último archivo nada más.
La idea es que procese cada archivo diciendo: "Exito...", por lo tanto debería salir algo así línea por línea:
Código HTML:
.
.
.
Cargando...
Exito...Archivo: W4100P4196.RSM leído
Cargando...
Exito...Archivo: W4100P4197.RSM leído
Cargando...
Exito...Archivo: W4100P4198.RSM leído
Cargando...
Exito...Archivo: W4100P4199.RSM leído
Cargando...
Exito...Archivo: W4100P4100.RSM leído
O sea, lo que quiero es que el FOR espere a que la funcionalidad AJAX se ejecute para continuar con la lectura de los otros archivos, si no se puede hacer eso entonces alguien podría sugerirme cómo cambiar mi código para lograr mi propósito?
Espero haberme explicado bien.
Gracias de antemano por la ayuda.
  #2 (permalink)  
Antiguo 01/10/2008, 15:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Procesamiento de archivos locales con AJAX

Hola tblancog,

Bienvenido al foro.

Solo tienes que cambiar el modo de tu request AJAX a que sea sincrono, esto se hace especificando como false el 3er parámetro de ajax.open.

Saludos.
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 04:25.