Foros del Web » Programando para Internet » PHP »

Descargar fichero y redireccionar

Estas en el tema de Descargar fichero y redireccionar en el foro de PHP en Foros del Web. Estimados foreros del web, a ver si alguien me puede hechar una mano. Despúes de generar un fichero xml a través de una función intento ...
  #1 (permalink)  
Antiguo 12/03/2009, 15:43
 
Fecha de Ingreso: octubre-2005
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
Descargar fichero y redireccionar

Estimados foreros del web,

a ver si alguien me puede hechar una mano. Despúes de generar un fichero xml a través de una función intento que se fuerce la descarga del fichero generado y me redireccione a otra página sin éxito. El código es más o menos el siguiente:

Código PHP:
//Generar el documento xml
$generarxml_ok=generarxml();

//Especificar fichero al que redireccionar
$ruta_redireccion="fichero.php";

//Si crea el xml correctamente, forzar su descarga y redirigir a otra página
if ($generarxml_ok){
  
$fichero="fichero.xml";
  
header"Content-Disposition: attachment; filename=".$fichero);
  
header"Content-Length: ".filesize($fichero));
  
header"Content-Type: aplication/octet-stream; name=$fichero");  
  
readfile($fichero);
  
header("Location:$ruta_redireccion");

Con esto lo que consigo es que se realice la redirección, pero no me fuerza la descarga.

También probé a redirigir con el código anterior pero sin la última linea del Location, y redireccionando con javascript de esta forma:

Código:
<script>
  location.href="<?php echo $ruta redireccion?>";
</script>
, pero el resultado es que se fuerza la descarga el fichero, pero no redirecciona, es más, el código javascript aparece insertado en el fichero xml descargado.

¿Alguna idea?

Muchas gracias de antemano. Saludos.
  #2 (permalink)  
Antiguo 12/03/2009, 15:47
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.978
Antigüedad: 11 años, 3 meses
Puntos: 2192
Respuesta: Descargar fichero y redireccionar

Si ya enviaste contenido (el archivo) no puedes enviar nuevos encabezados; la forma mas comun es crear una pagina donde pongas el mensaje de "La descarga inciara en unos segundos, si no inicia, haz click aqui para descargar el archivo" y, en la parte del head pones un meta tag para redireccionar al archivo deseado.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 12/03/2009, 15:50
 
Fecha de Ingreso: octubre-2005
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
Muchas gracias Tribby voy a probar.

Un saludo.

Cita:
Iniciado por Triby Ver Mensaje
Si ya enviaste contenido (el archivo) no puedes enviar nuevos encabezados; la forma mas comun es crear una pagina donde pongas el mensaje de "La descarga inciara en unos segundos, si no inicia, haz click aqui para descargar el archivo" y, en la parte del head pones un meta tag para redireccionar al archivo deseado.
Crei haberte entendido, pero la verdad es que no, y me explico. Entiendo lo que me comentas pero no sé como es exactamente, no tengo claro si es una página donde solo esta ese mensaje y la redirección a la página que quiero, y entonces donde pongo el código para forzar la descarga?. Parece que es lo mismo de que todo este en el mismo sitio, pero en otra página. Te agradecería si pudieras ser mas explicito, o indicarme donde puedo ver como se hace lo que me comentas.

Muchas gracias en todo caso Triby.

Última edición por GatorV; 12/03/2009 a las 16:13
  #4 (permalink)  
Antiguo 12/03/2009, 16:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Descargar fichero y redireccionar

El problema es que no puedes enviar ninguna cabecera después de enviar texto, en este caso forzas la descarga y luego el contenido binario, después quieres enviar una cabecera más y esto no es posible.

Lo mejor es desde la pagina donde estas forzando la descarga, abrir la descarga en una pagina nueva, esta se va a cerrar solita al detectar la descarga y con eso puedes redireccionar más tarde.

Saludos.
  #5 (permalink)  
Antiguo 12/03/2009, 16:37
 
Fecha de Ingreso: octubre-2005
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Descargar fichero y redireccionar

Cita:
Iniciado por GatorV Ver Mensaje
El problema es que no puedes enviar ninguna cabecera después de enviar texto, en este caso forzas la descarga y luego el contenido binario, después quieres enviar una cabecera más y esto no es posible.

Lo mejor es desde la pagina donde estas forzando la descarga, abrir la descarga en una pagina nueva, esta se va a cerrar solita al detectar la descarga y con eso puedes redireccionar más tarde.

Saludos.
Gracias lo primero GatorV,
entiendo perfectamente lo que tu y Triby me comentais de que no puedo enviar una cabecera más.

Lo que no indicaba al comentar el problema, es que desde donde fuerzo la descarga no es una página sino un script de proceso, desde donde a parte de otras acciones sobre base de datos, y donde según unos criterios se genera el fichero xml o no, y posteriormente se debe volver a la página desde donde se lanzó el script en php que comento.

Entonces, según entiendo, lo que tengo que poner en el script (y no página) es abrir la descarga en una página lanzada desde el script (no se exactamente como hacerlo, seguro que es muy sencillo, pero no caigo), y ahi poner en metatag la vuelta a la página desde donde se lanzó el script. Es así o estoy más liao que la pata de un romano...

Disculpad mi torpeza.

Un saludo.
  #6 (permalink)  
Antiguo 12/03/2009, 16:39
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.978
Antigüedad: 11 años, 3 meses
Puntos: 2192
Respuesta: Descargar fichero y redireccionar

El proceso es "al reves", primero abres la pagina de "redireccion" y desde ahi inicias la descarga del archivo.

En http://www.maestrosdelweb.com/editorial/usarmetas/ busca la informacion de REFRESH, que es la que se utilizaria y, en tu script de descarga solo haces la descarga, ninguna otra accion.

Edito:

No habia leido que quieres regresar a la pagina donde se origino la descarga, entonces la sugerencia de GatorV es mejor, abres la descarga en una ventana nueva y el usuario sigue en la misma pagina.
__________________
- León, Guanajuato
- GV-Foto
  #7 (permalink)  
Antiguo 12/03/2009, 18:03
 
Fecha de Ingreso: octubre-2005
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Descargar fichero y redireccionar

Cita:
Iniciado por Triby Ver Mensaje
El proceso es "al reves", primero abres la pagina de "redireccion" y desde ahi inicias la descarga del archivo.

En página que quito por no poder poner links busca la informacion de REFRESH, que es la que se utilizaria y, en tu script de descarga solo haces la descarga, ninguna otra accion.

Edito:

No habia leido que quieres regresar a la pagina donde se origino la descarga, entonces la sugerencia de GatorV es mejor, abres la descarga en una ventana nueva y el usuario sigue en la misma pagina.

Estimados Triby y GatorV, creo que me acerco a la solución, os explico como he modificado y el resultado...

Desde la página: mostrar_datos.php , a través de un botón, se lanza el proceso procesa_datos.php , (desde aquí antes intentaba hacer la descarga y redireccionar), en lugar de esto he puesto:

Código PHP:
$_SESSION['genera_xml']=true;
?>
<script language="javascript">
    location.href="mostrar_datos.php";
</script> 
, y en el fichero origen de "mostrar_datos.php", en el código de construcción de la página he puesto:

Código PHP:
//si se ha generado el archivo, lanzo el script de descarga en una ventana nueva
if ($_SESSION['genera_xml']){?>
    <script language="javascript">
        window.open("descargar_xml.php");
    </script>
<?php
}
//inicializo, para que solo descargue cuando se ha generado un nuevo archivo
$_SESSION['genera_xml']=false;
y el archivo descargar_xml.php tiene lo siguiente:

Código PHP:
<?php
  $fichero
="fichero.xml";
  
header"Content-Disposition: attachment; filename=".$fichero);
  
header"Content-Length: ".filesize($fichero));
  
header"Content-Type: aplication/octet-stream; name=".$fichero);  
  
readfile($fichero);
?>
Lo que ocurre, es que... vuelvo a "mostrar_datos.php" sin problema, pero cuando se abre la ventana con el window.open, no se inicia la descarga del xml, se cierra inmediatamente.

Seguro que falta algo, espero vuestra respuesta.

Muchas gracias.
  #8 (permalink)  
Antiguo 12/03/2009, 18:14
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.978
Antigüedad: 11 años, 3 meses
Puntos: 2192
Respuesta: Descargar fichero y redireccionar

Falta solo ver si el archivo existe:

Código php:
Ver original
  1. if(!file_exists($fichero))
  2.     die('El fichero no existe.');
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 12/03/2009, 18:20
 
Fecha de Ingreso: octubre-2005
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Descargar fichero y redireccionar

Cita:
Iniciado por Triby Ver Mensaje
Falta solo ver si el archivo existe:

Código php:
Ver original
  1. if(!file_exists($fichero))
  2.     die('El fichero no existe.');
El fichero se crea y existe, pero no se inicia la descarga. Quizás le falte algo al fichero de descarga que lanzo con el window.open?
  #10 (permalink)  
Antiguo 12/03/2009, 18:28
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.978
Antigüedad: 11 años, 3 meses
Puntos: 2192
Respuesta: Descargar fichero y redireccionar

Incluye esto antes de iniciar la descarga y nos cuentas que imprime:

Código php:
Ver original
  1. die('Tamaño: ' . filesize($fichero) . ' bytes');
__________________
- León, Guanajuato
- GV-Foto
  #11 (permalink)  
Antiguo 13/03/2009, 01:26
 
Fecha de Ingreso: octubre-2005
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Descargar fichero y redireccionar

Cita:
Iniciado por Triby Ver Mensaje
Incluye esto antes de iniciar la descarga y nos cuentas que imprime:

Código php:
Ver original
  1. die('Tamaño: ' . filesize($fichero) . ' bytes');
Se imprimió lo siguiente:

Tamaño: 377 bytes
  #12 (permalink)  
Antiguo 13/03/2009, 11:25
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 9.978
Antigüedad: 11 años, 3 meses
Puntos: 2192
Respuesta: Descargar fichero y redireccionar

Ok, entonces ahora pon el readfile() antes de enviar los encabezados, para que lo veas en pantalla y puedas saber si hay algun error en el archivo.
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 16/03/2009, 00:15
 
Fecha de Ingreso: octubre-2005
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Descargar fichero y redireccionar

Cita:
Iniciado por GatorV Ver Mensaje
Lo mejor es desde la pagina donde estas forzando la descarga, abrir la descarga en una pagina nueva, esta se va a cerrar solita al detectar la descarga y con eso puedes redireccionar más tarde.

Saludos.
Estimados Triby y GatorV,

Triby: Puse la lectura antes y quitaba los header para verlo porque si no se cerraba la ventana y el archivo estaba correcto.

GatorV: Como pusiste efectivamente al detectar la descarga se cierra la ventana... pero entonces no me sale el cuadro de diálogo para guardar el fichero de descarga. Es decir el cliente no descarga el fichero.

A ver si se os ocurre algo para que pueda funcionar. Yo he seguido buscando otras formas pero no encuentro nada.

Gracias por vuestro tiempo, a ver si encontramos un solución.

Última edición por desenfocado; 16/03/2009 a las 01:52 Razón: completar
  #14 (permalink)  
Antiguo 16/03/2009, 00:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Descargar fichero y redireccionar

Cual es el tamaño del fichero? Si es muy poco es probable que por eso no salga la ventana de descarga, aunque en teoria deberia de funcionar correctamente.
  #15 (permalink)  
Antiguo 16/03/2009, 01:28
 
Fecha de Ingreso: octubre-2005
Mensajes: 10
Antigüedad: 14 años, 1 mes
Puntos: 0
Bueno, al final parece que funciona, aunque el último tema planteado dependía de cambiar la configuración del navegador, en este caso, utilizaba IE.

En concreto, en Opciones de Internet, pestaña "Seguridad", seleccionar la zona "Internet" y pulsar en "Nivel personalizado", buscar la sección "Descargas" y en "Preguntar automáticamente si se debe descargar un archivo", seleccionar "Habilitar".

De esta forma al abrirse la ventana forzando la descarga, no se cerrará automáticamente, sino que abrirá el cuadro de diálogo de "Descarga de archivos" para abrir, guardar o cancelar.

En Firefox, sólo hay que añadir nuestra web a las excepciones de sitios a los que no debe bloquear las ventanas emergentes si tenemos esta opción señalada en el navegador.

No sé si habría otra forma, pero es, junto con los cambios sugeridos por Triby y GatorV, la que ha funcionado.

Muchisimas gracias a ambos.

Saludos.

Me resulta curioso que tenga que configurar el navegador para que funcione cuando se trata de una ventana nueva, como indico en el mensaje anterior y funcionara sin tener que cambiar nada si se lanza directamente el forzado de descarga en la página que este activa.

Pero bueno, el caso es que funcione, ¿no?

En fin, si no hay más sugerencias, se puede dar por cerrado el tema.

Saludos.

Cita:
Iniciado por GatorV Ver Mensaje
Cual es el tamaño del fichero? Si es muy poco es probable que por eso no salga la ventana de descarga, aunque en teoria deberia de funcionar correctamente.
El último tamaño del fichero con el que trabajo es de 1,98 KB. El inicial era de 337 bytes.

Pero no parece que sea el tamaño el motivo para que no funcione. Aunque, ¿si así fuera? ¿como solucionarlo?

Bueno, con el cambio de configuración como indique despúes ya funciona.

Gracias GatorV.

Última edición por GatorV; 16/03/2009 a las 10:06
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 20:46.