Pregunta

Tengo una aplicación PHP que crea un archivo CSV que se ve obligado a descargar usando encabezados. Aquí está la parte relevante del código:

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 nueva página una vez que se haya creado el archivo y se envíe la solicitud de descarga. Simplemente agregar header("Location: /newpage") al final no funcionó, se espera, así que no estoy seguro de cómo arreglar esto.

¿Fue útil?

Solución

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

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

Entonces redirija a sus usuarios a la página final que (entre otras cosas) dice:

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

En cuanto a iniciar la descarga (por ejemplo, llamar automáticamente a create_csv.php) tiene 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]

Otros consejos

muy fácil de hacer en caso de que sea realmente necesario.

Pero necesitará tener un poco de trabajo en JavaScript y cookies:

en PHP debe agregar la configuración de una cookie

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

luego, en la página donde llama a la descarga, debe realizar un seguimiento con JS (por ejemplo, una vez por segundo) si llega una cookie como esa (se usa el complemento jQuery cookie aquí):

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

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

Ahora, si el archivo comienza a descargarse, JS lo reconoce y redirige a la página necesaria después de eliminar la cookie.

Por supuesto, puede decir que necesita un navegador para aceptar cookies, JavaScript, etc., pero funciona.

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

Entonces, agregar un encabezado de redireccionamiento que confunda todo el proceso de descarga del archivo (dado que los encabezados se recopilan, se generan en un encabezado y luego se envían al navegador, puede intentarlo configurando múltiples encabezados de redireccionamiento IIRC)

Tenga en cuenta, sin embargo, que el inicio automático de los archivos descargables para los usuarios de IE activará la pestaña de advertencia de seguridad. Los tres métodos descritos por daremon mostrarían esta advertencia. Simplemente no puedes evitar esto. Será mejor servido si proporciona enlaces reales.

Encontré una solución alternativa para esto que se basa en JavaScript, por lo que no es exactamente seguro, 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, usando javascript, coloque algo en el controlador de envío que elimine el botón de descarga y reemplace los mensajes en la pantalla. La descarga aún debería ocurrir y la pantalla cambiará. Obviamente, si hay un problema con el script de descarga, entonces todavía parece que la descarga fue exitosa, incluso si no se dispara, pero es lo mejor que tengo en este momento.

Este es un problema bastante antiguo, 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

<?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í hay una solución usando javascript.

Puede intentar y redirigir 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 descargarlo.

Inicie 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 está la función de JavaScript popoutWin

/*
 * 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 la solicitud de descarga CSV y luego cerrará la ventana inmediatamente, dejando solo la solicitud.

Aquí está la respuesta:
¡Es trabajo!
Necesita tres partes diferentes 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);
            }

        }

Hmmmm ...

Coloque el código a continuación en el javascript principal del sitio.

 if (window.location.pathname == '/url_of_redirect/') {
        window.open(location.protocol + '//' + location.hostname + '/url_of_download.zip', '_parent');
    }

Explicando: Realiza la redirección normal con php a alguna url que diferirá y en javascipt dice: Si el nombre de ruta es el mismo que la ruta que realizó la redirección '/ url_of_redirect /', entonces abre la url en una nueva página, generando la descarga.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top