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.