2009-05-05 95 views
53

Tengo una aplicación PHP que crea un archivo CSV que se ve obligado a descargar usando encabezados. Esta es la parte relevante del código:PHP generar archivo para descargar y luego redirigir

header('Content-Type: application/csv'); 
header("Content-length: " . filesize($NewFile)); 
header('Content-Disposition: attachment; filename="' . $FileName . '"'); 
echo $content; 
exit(); 

Lo que me gustaría hacer es redirigir a los usuarios a una página nueva después de que el archivo se construye y la línea de descarga se envía. Simplemente añadiendo header("Location: /newpage") al final no funcionó, como era de esperar, así que no estoy seguro de cómo configurar esto.

Respuesta

75

No creo que esto se pueda hacer, aunque no estoy 100% seguro.

Lo común (por ejemplo, en los sitios de descarga populares) es el inverso: primero, vaya a la página después de y luego comienza la descarga.

Así redirigir a los usuarios a la página final de que (entre otras cosas) dice:

Su descarga se iniciará automáticamente. Si no, haga clic en [a href="create_csv.php"]here[/a].

Puesto que alrededor de iniciar la descarga (por ejemplo, activar automáticamente create_csv.php) que tienen muchas opciones:

  • HTML: [meta http-equiv="refresh" content="5;url=http://site/create_csv.php"]
  • Javascript: location.href = 'http://site/create_csv.php';
  • iframe: [iframe src="create_csv.php"][/iframe]
+0

me gané ... :) – nickf

+0

1up para las tres opciones –

+0

¿Cómo hacer esto cuando iniciando ya estaba iniciado y drupal ya está mostrando una página? ¿Cuál es el código del javascript? – Justme

7

El encabezado que está enviando es encabezados HTTP. El navegador toma eso como una solicitud de página y lo procesa como una página. Y en tu caso, una página que necesita descargar.

por lo que añadir una cabecera de redirección para que confunde a todo el proceso de descarga del archivo (ya que se recogen las cabeceras, generada en una cabecera y luego se envía al navegador, puede hacer esto mediante el establecimiento de múltiples redirección IIRC cabeceras)

2

oso en mente, sin embargo, la iniciación automática de archivos descargables para usuarios de IE activará la pestaña de advertencia de seguridad. Los tres métodos descritos por daremon mostrarán esta advertencia. Usted simplemente no puede evitar esto. Serás mejor atendido si proporcionas enlaces reales.

1

Encontré una solución para esto que se basa en javascript, por lo que no es exactamente segura, pero para sitios críticos no seguros parece funcionar.

Tenga un formulario con un botón titulado 'descargar' con la acción configurada para apuntar a la secuencia de comandos de descarga, luego use javascript ponga algo en el controlador onsubmit que elimine el botón de descarga y reemplace los mensajes en la pantalla. La descarga debería continuar y la pantalla cambiará. Obviamente, si hay un problema con el script de descarga, parece que la descarga fue exitosa, incluso si no se dispara, pero es lo mejor que tengo ahora.

0

Puede intentar y redireccionar a la URL más un parámetro que represente el contenido del archivo. Y en la redirección, puede generar el contenido del archivo para su descarga.

8

muy fácil de hacer en el caso de que realmente se necesite.

Pero tendrá que tener un trabajo poco en JavaScript y las cookies:

en PHP se debe añadir la creación de una galleta

header('Set-Cookie: fileLoading=true'); 

a continuación en la página donde se llama a la descarga que debe realizar un seguimiento con JS (por ejemplo, una vez por segundo) si no es procedente la galleta así (se utiliza el plugin jQuery cookie aquí):

setInterval(function(){ 
    if ($.cookie("fileLoading")) { 
    // clean the cookie for future downoads 
    $.removeCookie("fileLoading"); 

    //redirect 
    location.href = "/newpage"; 
    } 
},1000); 

Ahora bien, si el archivo comienza a ser downoaded reco JS lo gnifica y redirige a la página necesaria luego de eliminar la cookie.

Por supuesto, puede indicarle que necesita navegador para aceptar cookies, JavaScript, y así sucesivamente, pero funciona.

0

Esto es un problema bastante viejo, pero así es como lo logré a través de JS.

// Capture the "click" event of the link. 
var link = document.getElementById("the-link"); 
link.addEventListener("click", function(evt) { 
    // Stop the link from doing what it would normally do. 
    evt.preventDefault(); 
    // Open the file download in a new window. (It should just 
    // show a normal file dialog) 
    window.open(this.href, "_blank"); 
    // Then redirect the page you are on to whatever page you 
    // want shown once the download has been triggered. 
    window.location = "/thank_you.html"; 
}, true); 

Vía - https://www.daniweb.com/web-development/php/threads/463652/page-not-redirecting-after-sending-headers-in-php

1

lanzamiento el archivo PHP que contiene la descarga CSV usando:

<a onclick="popoutWin(\'csvexport.php\')" >Download CSV File</a> 

o

<input name="newThread" type="button" value="Download CSV File" 
     onclick="popoutWin(\'csvexport.php\')" /> 

donde la función JavaScript popoutWin es

/* 
* Popout window that self closes for use with downloads 
*/ 
function popoutWin(link){ 
    var popwin = window.open(link); 
    window.setTimeout(function(){ 
     popwin.close(); 
    }, 500); 
} 

Esto abrirá una ventana, para mostrar el mensaje de descarga CSV y luego cierre inmediatamente la ventana, dejando solo el aviso.

+0

Tenga en cuenta que puede necesitar aumentar el tiempo de popoutWin() a un valor mayor como 5000 si el código php (csvexport.php anterior) tarda en ejecutarse, de lo contrario la ventana se cerrará antes de que el script se haya completado y el usuario no estará dado la oportunidad de seleccionar el directorio para guardar el archivo de exportación. – Clinton

0

Aquí está la respuesta:
¡Es trabajo!
Se necesitan tres diferentes partes de código:

HTML

<a id="download_btn" class="btn btn-primary" href="?file=filename&download=1">Download<&/a> 


JQuery

$('#download_btn').click(function(){ 
    window.location.href = '<?=base_url()?>/?file=<?=$file;?>&download=1'; 
}).focusout (function(){ 
    window.location.href = '<?=base_url()?>'; 
    return false; 
}); 


PHP

 if(isset($_GET['download']) && isset($_GET['file'])){ 

      $zip_path = 'path_to/'.$_GET['file'].'.zip'; 

      if(file_exists($zip_path)){ 
       header('Content-Type: application/zip'); 
       header('Content-Disposition: attachment; filename="'.basename($zip_path).'"'); 
       header('Content-Length: ' . filesize($zip_path)); 
       header('Location: '.$zip_path); 
      } 

     } 
0
<?php 
    function force_file_download($filepath, $filename = ''){ 
     if($filename == ''){ 
      $filename = basename($filepath); 
     } 

     header('Content-Type: application/octet-stream'); 
     header("Content-Transfer-Encoding: Binary"); 
     header("Content-disposition: attachment; filename=\"" . $filename . "\""); 
     readfile($filepath); // do the double-download-dance (dirty but worky) 
    } 

    force_file_download('download.txt'); 
?> 
<script type="text/javascript"> 
    location = 'page2.php' 
</script> 

Aquí es una solución usando javascript.

Cuestiones relacionadas