Foros del Web » Programando para Internet » PHP »

Descargar archivos desde el servidor con botón "guardar"

Estas en el tema de Descargar archivos desde el servidor con botón "guardar" en el foro de PHP en Foros del Web. Hola a todos, Me encuentro en la etapa final de una aplicación basada en tres "Selects" dependientes utilizando tanto JavaScript como PHP. El tercero es ...
  #1 (permalink)  
Antiguo 22/01/2010, 09:05
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 2 meses
Puntos: 1
Descargar archivos desde el servidor con botón "guardar"

Hola a todos,

Me encuentro en la etapa final de una aplicación basada en tres "Selects" dependientes utilizando tanto JavaScript como PHP. El tercero es un select múltiple con referencia a archivos html que se pueden desplegar en pantalla, cada uno de ellos tiene su equivalente en xls. En este momento el usuario puede elejir y desplegar en pantalla los archivos html que desee y tiene la opción de guardar su equivalente en xls de manera individual, pero no puede guardar el/los archivos xls asociados a su selección sin desplegar en pantalla los respectivos html. Quiero implementar un botón que llame a una función en que recoja el/los archivos xls asociados a su selección y directamente le de la opción de guardarlos en su máquina local.

Soy muy novato en este tema, pero a fuerza de empeño y valiéndome de mucha ayuda que he encontrado aqui conseguí montar esta aplicación, pero ahora no consigo dar con la función que necesito para guardar los archivos de la manera en que necesito. Agradezco cualquier ayuda y/o pista que me puedan dar.
  #2 (permalink)  
Antiguo 22/01/2010, 09:14
 
Fecha de Ingreso: junio-2007
Mensajes: 189
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: Descargar archivos desde el servidor con botón "guardar"

Metes el boton guardar dentro de un formulario que envie la información a otra pagina web php

En esta pagina web puedes utilizar los header para "forzar" la descarga
  #3 (permalink)  
Antiguo 22/01/2010, 09:42
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Descargar archivos desde el servidor con botón "guardar"

Gracias Soutlink,

En este momento tengo dos botones en mi formulario para administrar si los archivos seleccionados se abren en la misma página (un botón) o en una separada (segundo botón). Cada uno de ellos hace un "submit" al servidor donde se ejecuta el siguiente código contenido en "Recibe.PHP":

Código PHP:
Ver original
  1. <?php
  2.  
  3.     foreach($_POST['selector3'] as $value)  
  4.     {    
  5.                      
  6.         include $value;
  7.         $save = trim($value);
  8.         $save1 = explode("htm",$save);
  9.         $save2 = $save1[0].xls;
  10.         $save3 = str_replace("IE","Otro",$save2);
  11.                                
  12. ECHO "<a href='.../ExcelFiles/$save3'><div align=center><img src='.../SaveFile.PNG' border=0></div></a> <br /><br />";
  13.                      }
  14.  
  15. ?>

Esto me devuelve, en cualquier caso una página html con los archivos seleccionados para ser vistos por el usuario y donde puede, además salvar/guardar cada xls asociado. Ahora, ya agregué mi tercer botón al mismo form, pero lo definí como "Type=Button" para que no hiciera el Submit y no me devuelva la página html producida por el código PHP, sino que permanezca la misma en que existen los Selects con las opciones introducidas por el usuario. Será que puedo tener una función que habra la ventana "guardar como" y permita almacenar cada uno de los xls asociado a los archivos seleccionados?...
Ojalá me puedas ayudar un poco más, gracias.
  #4 (permalink)  
Antiguo 22/01/2010, 09:50
 
Fecha de Ingreso: enero-2010
Mensajes: 152
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: Descargar archivos desde el servidor con botón "guardar"

bueno, como son varios archivos, tienes dos opciones:

La primera es que tu botón "descargar" ejecute un script que diga:
Código Javascript:
Ver original
  1. location.href="download.php?archivo="+archivo;

Esto en un bucle usando setinterval y cambiando el valor de "archivo" por el identificador del archivo a descargar, de esa manera tu usuario verá los cuadros de descarga aparecer uno tras otro.

La otra opción es que desde tu archivo PHP comprimas todos los ficheros a enviar en un ZIP y lo envíes en una sola descarga. Para ello tienes que mandar con javascript:

Código Javascript:
Ver original
  1. location.href="download.php?archivo="+archivo+","+archivo2+","+archivo3;

Esa es, para mí, la solución más cómoda para el usuario.

Por cierto..... la mayoría d elos navegadores analiza el content-Type del documento antes de presentarlo, así que si se trata de una descarga presentarán la ventana de descargas sin cambiar de página.
  #5 (permalink)  
Antiguo 22/01/2010, 10:36
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Descargar archivos desde el servidor con botón "guardar"

Gracias Paynalton,

Voy a intentar con la primera opción que me das, si me resulta probaré con la segunda (que tal como dices, pienso que es la mejor). Ahora disculpa que siga molestando, pero no me queda claro cómo hacerlo. En este momento mi botón "guardar" llama a la siguiente función JavaScript:

Código Javascript:
Ver original
  1. function TestFunction(){
  2.  
  3.  
  4.                 if(document.form1.selector3.selectedIndex >= 0){
  5.                    document.form1.elements[5].disabled=false;
  6.                    
  7.                    
  8.                
  9.                   alert ("Aqui estoy ahora");
  10.                    
  11.     }


En ésta función es que debo poner la línea:

Código Javascript:
Ver original
  1. location.href="download.php?archivo="+archivo;

Mientras que en "download.php" pongo el código para tomar la/s opcion/es seleccionadas?

Gracias por tu ayuda.
  #6 (permalink)  
Antiguo 22/01/2010, 10:58
 
Fecha de Ingreso: enero-2010
Mensajes: 152
Antigüedad: 14 años, 2 meses
Puntos: 5
Respuesta: Descargar archivos desde el servidor con botón "guardar"

Ok, en la función javascript deberías colocar algo así:

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

mientras tanto, hay otros post que explican como servir descargas con PHP, con lo que podrás redefinir Recibe.PHP.

Si usas este método, recibirás en Recibe.PHP la variable $_GET["Archivo"] que contendrá el valor (value) de las opciones seleccionadas, entonces solo tienes que identificar el archivo deseado y servirlo con PHP.
  #7 (permalink)  
Antiguo 25/01/2010, 14:54
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 2 meses
Puntos: 1
Respuesta: Descargar archivos desde el servidor con botón "guardar"

Gracias por responder de tan buena y dedicada manera Paynalton. Trabajé bastante para hacer funcionar el código que me proporcionaste, pero lamentablemente no he podido conseguir el resultado esperado. Cuento lo que he hecho con la idea de obtener un poco más de ayuda, porque no consigo dar con la manera de hacer lo que necesito:

1.- En primer lugar cambié el archivo php de destino que me propones (recibe.php) por (download.php)

Código Javascript:
Ver original
  1. location.href=".../download.php?archivo="+archivos[indiceActual];//llamamos a la descarga en turno

El código que puse en "download.php" es el siguiente:

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.  
  21.  
  22.                                                                          
  23.     readfile($path);                                                      
  24.                                                                          
  25. ?>

2.- Revisando la aplicación con FireFox y usando FireBug, puedo ver que todo marcha bien hasta llegar a la línea:

Código Javascript:
Ver original
  1. descargame=function()//definimos la función que se encargará de ...

pero nunca entra a evaluar la condición puesta a continuación y termina lléndose directamente a la línea:

Código Javascript:
Ver original
  1. downloader=setInterval(descargame,1000);// aqui definimos el intervalo

3.- Escribí la funcion "descargame" separada de "TestFunction", pero la llamo desde aquí con "descargarme ()" De esta manera sí puedo entrar a la función, pero nunca se cumple la condición del "if" de manera que tampoco consigo hacer nada.

Código Javascript:
Ver original
  1. <script language="JavaScript" type="text/JavaScript">
  2.  
  3.            function descargame()//definimos la función que se encargará de llamar a las descargas.
  4.                   {
  5.                   if(archivos[indiceActual])
  6.                          {
  7.                           location.href=".../download.php?archivo="+archivos[indiceActual];//llamamos a la descarga en turno
  8.                          }
  9.                   else
  10.                          {
  11.                         indiceActual=1;
  12.                         archivos=new Array();
  13.                         clearInterval(downloader);//una vez que se han descargado todos, eliminamos el intervalo y limpiamos las variables
  14.                         }
  15.                   }
  16.            downloader=setInterval(descargame,1000);// aqui definimos el intervalo con un espacio de 1 segundo entre una descarga y otra.
  17.          
  18.  
  19.  
  20. </script>

Ojalá me puedan ayudar un poco más, porque solo no consigo hacer lo que necesito. Gracias por todo

Etiquetas: 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 12:53.