Foros del Web » Programando para Internet » PHP »

Descarga de archivos en PHP funciona, pero....

Estas en el tema de Descarga de archivos en PHP funciona, pero.... en el foro de PHP en Foros del Web. Hola a todos, Disculpen que habra un nuevo tema para una consulta que ya he hecho, pero necesito de su ayuda porque no consigo obtener ...
  #1 (permalink)  
Antiguo 26/01/2010, 14:11
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Descarga de archivos en PHP funciona, pero....

Hola a todos,

Disculpen que habra un nuevo tema para una consulta que ya he hecho, pero necesito de su ayuda porque no consigo obtener lo que necesito.

Tengo tres select asociados que manejo con JavaScript y PHP donde el último (Selector3) es múltiple. Tengo tres botones, dos hacen un submit para coseguir desplegar en pantalla las archivos htm asociados a las opciones seleccionadas por el usuario. El tercer boton en cambio llama una función con la idea de dar la alternativa de descargar directamente los archivos asociados a la selección realizada sin pasar por desplegarlos en pantalla, los archivos para descarga tienen formato xls. Mi problema es que ahora funciona todo bien hasta el momento en que debo servir los archivos para descarga con php, cuando llega a este punto (según el seguimiento que hago con firebug) la única opción de descarga que obtengo es para el último archivo que he enviado a PHP. El código es el siguiente (recorté la línea en el "location.href" para ahorrar espacio aquí):

Código Javascript:
Ver original
  1. <script language="JavaScript" type="text/JavaScript">
  2.  
  3.  var archivos=new Array();//ponemos estas variables fuera de las funciones para que estén disponibles globalmente
  4.  var indiceActual=1;
  5.  var downloader;
  6.     function DownFunction(){
  7.  
  8.             var x =1;
  9.                 for(i in document.form1.selector3.options){
  10.                    if(document.form1.selector3.options[i].selected)
  11.                          {
  12.                         archivos[x]=document.form1.selector3.options[i].value;//cargamos los archivos a descargar en esta variable global
  13.                         archivos[x]=archivos[x].replace(".htm",".xls");  
  14.                             x++;
  15.                                                 }
  16.                       }
  17.  
  18.                                     descargame=function()//definimos la función que se encargará de llamar a las descargas.           }
  19.                  {
  20.                  if(archivos[indiceActual])
  21.                         {
  22.                                     location.href=".../download.php?archivo="+archivos[indiceActual];
  23.                         }
  24.                  else
  25.                         {
  26.                        indiceActual=1;
  27.                        archivos=new Array();
  28.                        clearInterval(downloader);//una vez que se han descargado todos, eliminamos el intervalo y limpiamos las variables
  29.                        }
  30.                  }
  31.           downloader=setInterval(descargame,1000);// aqui definimos el intervalo con un espacio de 1 segundo entre una descarga y otra.
  32.           }
  33.  
  34. </script>


El código en "download.php"

Código PHP:
Ver original
  1. <?php
  2.  
  3. if (!isset($_GET['archivo']) || empty($_GET['archivo'])) {
  4.     exit();
  5. }
  6.  
  7. $root = ".../ExcelFiles/";
  8. $archivo = basename($_GET['archivo']);
  9. $path = $root.$archivo;
  10.                                                                                                                                                    
  11. $type = '';                                                              
  12.     $type = "application/force-download";                                
  13.                                                                          
  14.                                                                          
  15.     header("Content-Type: $type");                                        
  16.     header("Content-Disposition: attachment; filename=$archivo");        
  17.     header("Content-Transfer-Encoding: binary");                          
  18.     header("Content-Length: " . $size);                                  
  19.                                                                          
  20.     readfile($path);                                                      
  21.  
  22. ?>

Agradezco toda la ayuda que me puedan brindar.
  #2 (permalink)  
Antiguo 26/01/2010, 14:21
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Descarga de archivos en PHP funciona, pero....

¿pero que quieres hacer?: que al forzar la descarga del archivo no se recargue la página y los combos dependientes no pierdan su estado actual: es simple, utiliza un iframe para enviar las solicitudes de descarga, y reemplaza:

location.href=".../download.php?archivo="+archivos[indiceActual];
por:
window.open(".../download.php?archivo="+archivos[indiceActual],'id_del_iframe');

para así dirigir la descarga a ese iframe
  #3 (permalink)  
Antiguo 26/01/2010, 14:28
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Descarga de archivos en PHP funciona, pero....

Gracias maycolalvarez, En este momento ya consigo forzar la descarga sin perder el estado de los Selects. Lo que sucede es que la descarga sólo me da la opción de bajar un sólo archivo (si eligiera siempre uno no hay problema), pero si elijo dos o más -dado que el select es múltiple- entonces sólo puedo ver y bajar el último archivo en la lista o variable matriz que envío para ser servida en php.
  #4 (permalink)  
Antiguo 26/01/2010, 14:55
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Descarga de archivos en PHP funciona, pero....

arreglando un poco mejor el codigo, resuta que lo que le falta es incrementar indiceActual para pasar al archivo siguiente:

Código Javascript:
Ver original
  1. <script language="JavaScript" type="text/JavaScript">
  2.  
  3.  var archivos=new Array();//ponemos estas variables fuera de las funciones para que estén disponibles globalmente
  4.  var indiceActual=1;
  5.  var downloader;
  6.     function DownFunction(){
  7.         var x =1;
  8.         var opciones= document.forms['form1'].elements['selector3'].options;
  9.         for(var i in opciones){
  10.             if(opciones.options[i].selected)
  11.             {
  12.                 archivos[x]=opciones.options[i].value;//cargamos los archivos a descargar en esta variable global
  13.                 archivos[x]=archivos[x].replace(".htm",".xls");  
  14.                 x++;
  15.             }
  16.         }
  17.         indiceActual=1;
  18.         downloader=setInterval('descargame();',1000);// aqui definimos el intervalo con un espacio de 1 segundo entre una descarga y otra.
  19.     }
  20.     function descargame()//definimos la función que se encargará de llamar a las descargas.           }
  21.     {
  22.         if(archivos[indiceActual])
  23.         {
  24.             location.href=".../download.php?archivo="+archivos[indiceActual];
  25.             indiceActual++; //ESTO ERA LO QUE FALTABA
  26.            
  27.         } else {
  28.             indiceActual=1;
  29.             archivos=new Array();
  30.             clearInterval(downloader);//una vez que se han descargado todos, eliminamos el intervalo y limpiamos las variables
  31.         }
  32.     }
  33.  
  34. </script>
  #5 (permalink)  
Antiguo 26/01/2010, 16:13
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Descarga de archivos en PHP funciona, pero....

Muchas gracias maycolalvarez, por fin conseguí que funcionara al introducir los cambios que hiciste (separaste las funciones y corregiste referencias y posición de llamada a variables) al código que ya tenía, pues en el que escribiste no conseguí pasar de la línea:
"if(opciones.options[i].selected).

Ahora, el problema que se presenta es que sólo funciona en firefox; mientras que en IExplorer no lo hace, con el agravante que no puedo seguir el procedimiento como lo hago con firebug. Si pudieras darme una idea de porqué sucede te lo agradecería.

El código funcionando bien (en Firefox) quedó así:

Código Javascript:
Ver original
  1. <script language="JavaScript" type="text/JavaScript">
  2.  
  3.  var archivos=new Array();
  4.  var indiceActual=1;
  5.  var downloader;
  6.            function DownFunction(){
  7.  
  8.                 var x =1;
  9.                 for(i in document.form1.selector3.options)
  10.                    {
  11.  
  12.                    if(document.form1.selector3.options[i].selected)
  13.                          {
  14.                         archivos[x]=document.form1.selector3.options[i].value;
  15.                         archivos[x]=archivos[x].replace(".htm",".xls");  
  16.                         x++;
  17.                                                   }
  18.                       }
  19.                                     indiceActual=1;
  20.                                     downloader=setInterval('descargame();',1000);
  21.         }
  22.  
  23.        function descargame()
  24.                    {
  25.                        if(archivos[indiceActual])
  26.                         {
  27.                                                 location.href=".../download.php?archivo="+archivos[indiceActual];
  28.             indiceActual++;
  29.                         }
  30.                  else
  31.                         {
  32.                        indiceActual=1;
  33.                        archivos=new Array();
  34.                        clearInterval(downloader);
  35.                        }
  36.                  }
  37.  
  38. </script>
  #6 (permalink)  
Antiguo 26/01/2010, 17:19
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Descarga de archivos en PHP funciona, pero....

El problema se produce en la línea:

Código Javascript:
Ver original
  1. if(document.form1.selector3.options[i].selected)

Lo comprobé obteniendo un mensaje de alerta justo antes esa línea.

Código Javascript:
Ver original
  1. for(i in document.form1.selector3.options){
  2.                
  3.                    vale=document.form1.selector3.options[i].value
  4.            
  5.                    alert(vale)
  6.            alert("El valor de i es:" + "" + i)

En Firefox me devuelve la propiedad "value" de cada opción y el valor de "i" en cada iteración... (son siete opciones) pero, además me entrega cuatro valores "Undefine" (como si tuviese 11 opciones) y el contenido de los últimos cuatro "values" es "item"; "selectindex"; "length" y "nameditem" respectivamente... Bueno, en IE realiza sólo cinco iteraciones (deberían ser siete) y cada una es del tipo : "Undefine" para value y "language" para "i". Entonces, claro que nunca va a funcionar en IE y de suerte funciona en FireFox.

Alguien me puede dar una idea de que es lo que pasa? y cómo lo puedo solucionar?

Gracias por la ayuda...

Etiquetas: descargas
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 06:04.