Domanda

Ho un'app PHP che crea un file CSV che è costretto a scaricare usando le intestazioni. Ecco la parte pertinente del codice:

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

Quello che vorrei fare è reindirizzare gli utenti a una nuova pagina dopo che il file è stato creato e il prompt di download è stato inviato. L'aggiunta di header("Location: /newpage") alla fine non ha funzionato, probabilmente, quindi non sono sicuro di come risolverlo.

È stato utile?

Soluzione

Non credo che ciò possa essere fatto, anche se non sono sicuro al 100%.

La cosa comune (ad esempio nei siti di download popolari) è il contrario: prima vai alla pagina after e poi inizia il download.

Quindi reindirizza i tuoi utenti alla pagina finale che (tra le altre cose) dice:

Il download dovrebbe avviarsi automaticamente. In caso contrario, fai clic su [a href="create_csv.php"]here[/a].

Per iniziare il download (ad es. chiamando automaticamente create_csv.php) hai molte opzioni:

  • 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]

Altri suggerimenti

molto facile da fare nel caso sia davvero necessario.

Ma dovrai avere un po 'di lavoro in JavaScript e cookie:

in PHP dovresti aggiungere l'impostazione di un cookie

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

quindi nella pagina in cui chiami il download dovresti tracciare con JS (ad esempio una volta al secondo) se c'è un cookie in arrivo simile (c'è un plugin usato cookie jQuery qui):

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

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

Ora se il file inizia a essere scaricato, JS lo riconosce e reindirizza alla pagina necessaria dopo l'eliminazione del cookie.

Certo, puoi dire che hai bisogno del browser per accettare i cookie, JavaScript e così via, ma funziona.

Le intestazioni che stai inviando sono intestazioni HTTP. Il browser lo prende come richiesta di pagina e lo elabora come pagina. E nel tuo caso, una pagina che deve scaricare.

Quindi l'aggiunta di un'intestazione di reindirizzamento a confonde l'intero processo di download del file (poiché le intestazioni vengono raccolte, generate in un'intestazione e quindi inviate al browser, puoi provare impostando più intestazioni di reindirizzamento IIRC)

Tieni presente, tuttavia, l'avvio automatico dei file scaricabili per gli utenti di IE attiverà la scheda di avviso di sicurezza. Tutti e tre i metodi indicati da daremon mostrerebbero questo avvertimento. Semplicemente non puoi aggirare questo. Sarai servito meglio se fornisci collegamenti reali.

Ho trovato una soluzione alternativa per questo che si basa su JavaScript, quindi non è esattamente sicuro, ma per i siti critici non sicuri sembra funzionare.

Avere un modulo con un pulsante intitolato 'download' con l'azione impostata per puntare allo script di download, quindi usando javascript metti qualcosa sul gestore onsubmit che rimuove il pulsante di download e sostituisce la messaggistica sullo schermo. Il download dovrebbe comunque avvenire e lo schermo cambierà. Ovviamente, se c'è un problema con lo script di download, sembra che il download abbia avuto esito positivo anche se non si attiva, ma è il migliore che ho adesso.

Questo è un problema piuttosto vecchio, ma ecco come l'ho raggiunto tramite 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);

Via - 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>

Ecco una soluzione che utilizza JavaScript.

Puoi provare a reindirizzare all'URL più un parametro che rappresenta il contenuto del file. E nel reindirizzamento, è possibile generare il contenuto del file per il download.

Avvia il file PHP che contiene il download 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\')" />

dove la funzione 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);
}

Questo aprirà una finestra, per visualizzare il prompt di download CSV e quindi chiudere immediatamente la finestra, lasciando solo il prompt.

Ecco la risposta:
È lavoro!
Sono necessarie tre diverse parti di codice:
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 ...

Inserisci il codice qui sotto nel javascript principale del sito.

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

Spiegazione: Fa il normale reindirizzamento con php a qualche url che definirai e in javascipt dice: Se il percorso è lo stesso del percorso che il reindirizzamento ha fatto '/ url_of_redirect /', allora apre l'URL su una nuova pagina, generando il downlod.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top