Foros del Web » Programando para Internet » PHP »

Un problema mayor en la descarga de archivos con php

Estas en el tema de Un problema mayor en la descarga de archivos con php en el foro de PHP en Foros del Web. Hola amigos, He estado trabajando en la habilitación de un botón para descargar archivos xls asociados a opciones en un select múltiple. Con la ayuda ...
  #1 (permalink)  
Antiguo 27/01/2010, 07:05
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Un problema mayor en la descarga de archivos con php

Hola amigos,

He estado trabajando en la habilitación de un botón para descargar archivos xls asociados a opciones en un select múltiple. Con la ayuda de los miembros del foro Paynalton y maycolalvarez conseguí que al seleccionar una o más opciones del select se forzara la descarga y los archivos fuesen servidos con php. Ahora tengo dos problemas para los que necesito ayuda.

1. Para cada archivo asociado a la opción seleccionada se abre la ventana de windows con las opciones de "abrir", "guardar", "cancelar". El problema aquí es que sólo la ventana de descarga para el último archivo servido aparece con el foco en la opción "guardar"; mientras que en las restantes el foco aparece en "cancelar". Cómo podría hacer para que cuando se ha guardado un archivo, la siguiente ventana aparezca con el foco en "guardar"?

2.- El problema mayor es que cuando bajo los archivos usando Firefox, estos están bien, perooo cuando los bajo usando IExplorer me encuentro con que al abrirlos en excel NO TIENEN DATOS!!! Será que alguien me da una pista para saber que ocurre?

A continuación el código que utilizo:

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.    
  7.            function DownloadFunction(){
  8.  
  9.             var x =1;
  10.  
  11.             var Noptions = document.forms["form1"].selector3.length;
  12.            //  for(i in document.form1.selector3.options){ // Esta línea hacía que en IE no funcionara el resto de la función
  13.              
  14.                   for (i = 0; i < Noptions; i++) {
  15.                
  16.                    if(document.form1.selector3.options[i].selected)
  17.                          {
  18.                         archivos[x]=document.form1.selector3.options[i].value;
  19.                         archivos[x]=archivos[x].replace(".htm",".xls");  
  20.                         x++;
  21.                                              }
  22.                       }
  23.                                     indiceActual=1;
  24.                                     downloader=setInterval('descargame();',1000);
  25.                                     }
  26.  
  27.      function descargame()
  28.                  {
  29.                         if(archivos[indiceActual])
  30.                         {
  31.                                              location.href=".../download.php?archivo="+archivos[indiceActual];
  32.              indiceActual++;
  33.                         }
  34.                  else
  35.                         {
  36.                        indiceActual=1;
  37.                        archivos=new Array();
  38.                        clearInterval(downloader);
  39.                        }
  40.                  }
  41.  
  42. </script>

Y en el archivo "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. ?>

Gracias por la ayuda que me puedan dar.
  #2 (permalink)  
Antiguo 27/01/2010, 07:49
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Un problema mayor en la descarga de archivos con php

1. Este problema es más de javascript que de PHP.
2. a. Escribele un id al boton y luego con javascript lo llamas algo así
Código Javascript:
Ver original
  1. document.getElementById("nombreDelID").focus();
b. No entendí la segunda pregunta.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 27/01/2010, 08:33
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Un problema mayor en la descarga de archivos con php

Gracias abimaelrc,

Un ejemplo de lo que sucede respecto a la segunda pregunta, es que descargo un archivo xls que en la carpeta de almacenamiento pesa 50 KB. Si lo hago usando Firefox, el archivo se descarga bien y lo hace pesando 51 KB (no se porqué la diferencia, pero está bien); si lo hago usando IExplorer, el mismo archivo se baja pesando 2 KB!!! y al abrirlo en excel pues no tiene nada.

Si coloco la dirección "http://.../download.php?archivo=BO_Coch_Migr_21_Otro.xls" en la barra de direcciones de Firefox, el archivo se descarga tal como describí antes; si la coloco en la barra de direcciones de IExplorer, el archivo se baja pesando los 2KB que comento antes. Qué puede estar ocurriendo?

Ojalá me puedan ayudar. Gracias.
  #4 (permalink)  
Antiguo 27/01/2010, 09:00
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Un problema mayor en la descarga de archivos con php

IE tiende a grabar en el cache lo que has hecho anteriormente en la página y si no nota algun cambio en la petición de la barra de direcciones te traerá la información que anterioremente había brindado. Tal vez cuando bajaste por primera vez el archivo con IE, lo trajo con errores, te sugiero que borres el cache de IE y vuelvas a bajar el documento.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #5 (permalink)  
Antiguo 27/01/2010, 09:19
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Un problema mayor en la descarga de archivos con php

Hice lo que me sugieres y el problema continua tal cual. Un detalle: En la ventana para descarga de archivos que me abre IE pone, frente a la descripción de tipo: "Hoja de cálculo de Microsoft Excel, 1,29 KB" ... cuando el archivo pesa realmente 50 KB!
  #6 (permalink)  
Antiguo 27/01/2010, 09:38
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: Un problema mayor en la descarga de archivos con php

Busqué por internet, y me encontré con algo similar ( http://www.webmasterworld.com/php/3556678.htm ). No sé que tan similar, pero según cuenta aquel usuario, lo solucionó eliminando las línas en blanco antes de los headers.

No sé que tanto te podría servir. Nos vemos.
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #7 (permalink)  
Antiguo 27/01/2010, 09:51
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: Un problema mayor en la descarga de archivos con php

En tu script para forzar la descarga no tienes $size, tienes que poner en alguna parte $size = filesize($basename); y luego en tu header agrega las comillas en caso de que tengas espacios:
Código PHP:
Ver original
  1. header("Content-Disposition: attachment; filename=\"$archivo\"");

Respecto a la ventana de IE, es un problema que no vas a poder solucionar ni con Javascript ya que la ventana es control de Internet Explorer.

Saludos.
  #8 (permalink)  
Antiguo 27/01/2010, 12:09
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Un problema mayor en la descarga de archivos con php

Gracias por sus resapuestas y sugerencias, pero ahora es uno de esos momentos en que verdaderamente querría y necesito saber más de PHP y programación...

Lo siento amigos, pero debo seguir pidiendo su ayuda porque apliqué sus sugerencias y no hay manera que IE me descargue el/los archivos de acuerdo a su tamaño/peso real. Sólo para efectos de ilustración agrego mi código que contiene, comentadas, dos líneas con alguna de las opciones que he intentado. Ojalá me puedan seguir ayudando. Gracias.

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. $size = filesize($archivo);                                                                                                                                                
  11.  
  12. $type = "";                                                              
  13.  
  14.       $type = "application/force-download";                              
  15.  
  16.     /* $type = "application/vnd.ms-excel"; */                                                                    
  17.                                                                          
  18.     header("Content-Type:$type");                                        
  19.       header("Content-Disposition:attachment;filename=$archivo");
  20.  
  21. /*  header("Content-Disposition: attachment; filename=\"$archivo\""); */
  22.      
  23.     header("Content-Transfer-Encoding:binary");                          
  24.     header("Content-Length:".$size);                                  
  25.     readfile($path);                                                      
  26.  
  27. ?>
  #9 (permalink)  
Antiguo 27/01/2010, 12:18
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Un problema mayor en la descarga de archivos con php

Nota adicional: La línea que tengo como $size = filesize($archivo); también la apliqué según la recomendación de GatorV: $size = filesize($basename); y el resultado fue el mismo: No sorrige el problema que se produce con IE!!
  #10 (permalink)  
Antiguo 27/01/2010, 13:39
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: Un problema mayor en la descarga de archivos con php

El chiste es que analices, a filesize le tienes que pasar la variable que contiene la ruta a tu archivo completo, en este caso sería $path.

Saludos.
  #11 (permalink)  
Antiguo 27/01/2010, 14:07
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Un problema mayor en la descarga de archivos con php

Disculpa amigo, pero es tal como dije antes... he probado una y muchas maneras, he intentado descifrar el código, le pasé la variable $path a filesize... en fin, pero nada compa.

Intenté obtener un mensaje de alerta usando echo tratando de obtener un alert()
para seguir la pista de qué es lo qué sucede... pero ni esto me resultó, en fin seguiré buscando y esperando cualquier otra ayuda. Porque al final se tiene que resolver, no?
  #12 (permalink)  
Antiguo 27/01/2010, 15:07
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Un problema mayor en la descarga de archivos con php

Tengo una pista, más no se si es correcta porque no tengo modo de verificarla en IExplorer: Conseguí hacer que en Firefox se recibiera el nombre de un archivo que no existe, de manera que cuando activo el botón de descarga no encontrara el archivo que va a buscar, y.... se produjo el mismo problema que tengo en IExplorer (descargó un archivo xls con el nombre que el hiba a buscar, pero el archivo está vacío). De donde deduzco que en IExplorer no se recibe la ruta correcta del archivo que debe descargar, de ser así el problema se produce en una o todas las variables siguientes :

Código Javascript:
Ver original
  1. $root = "http://localhost/.../.../.../ExcelFiles/";
  2. $archivo = basename($_GET['archivo']);
  3. $path = $root.$archivo;

Denme alguna idea de dónde buscar por favor!!!
  #13 (permalink)  
Antiguo 27/01/2010, 21:44
 
Fecha de Ingreso: enero-2009
Mensajes: 173
Antigüedad: 15 años, 3 meses
Puntos: 1
Respuesta: Un problema mayor en la descarga de archivos con php

Gracias a todos los que respondieron y me dieron las pistas que necesitaba para realizar la descarga segun necesitaba. El ultimo problema que reporte se debia a un error de mi parte en el que efectivamente IExplorer terminaba buscando un archivo inexistente.

Gracias de nuevo.

Etiquetas: mayor, 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 07:01.