Frage

Ich habe eine PHP-Anwendung, die eine CSV-Datei erstellt, die Header zum Download gezwungen verwendet. Hier ist der relevante Teil des Codes:

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

Was ich möchte, ist tun Benutzer umleiten zu einer neuen Seite, nachdem die Datei erstellt wird und die Download-Aufforderung gesendet wird. Nur das Hinzufügen header("Location: /newpage") bis zum Ende nicht funktioniert, expectedly, also bin ich nicht sicher, wie dies bis zu rig.

War es hilfreich?

Lösung

Ich glaube nicht, das getan werden kann - obwohl ich nicht 100% sicher bin

.

Die gemeinsame Sache (beispielsweise in beliebten Download-Seiten) ist das Gegenteil. Zuerst gehen Sie die nach Seite und dann der Download beginnt

So umleiten Ihre Benutzer auf die letzte Seite, die (unter anderem) sagt:

Ihr Download sollte automatisch starten. Wenn nicht [a href="create_csv.php"]here[/a] klicken.

Wie etwa den Download initiieren (z automatisch Aufruf create_csv.php) haben Sie viele Möglichkeiten:

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

Andere Tipps

sehr einfach in dem Fall zu tun es wirklich notwendig ist.

Aber Sie müssen ein wenig Arbeit in JavaScript und Cookies haben:

in PHP sollten Sie summieren sich die Einrichtung eines Cookie

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

dann auf der Seite, wo Sie den Download rufen sollten Sie mit JS (zB einmal pro Sekunde) verfolgen, wenn es kommt Cookie wie das (es wird verwendet Plugin jQuery Cookie hier):

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

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

Nun, wenn die Datei zu werden beginnt downoaded JS erkennt und leitet auf die Seite benötigt nach Cookie gelöscht wird.

Natürlich können Sie sagen, müssen Browser-Cookies, JavaScript akzeptieren und so weiter, aber es funktioniert.

Der Header Sie senden sind HTTP-Header. Der Browser nimmt das als Seitenanforderung und verarbeitet es als eine Seite. Und in Ihrem Fall eine Seite braucht es zum Download bereit.

So Hinzufügen eines Redirect-Header, dass der gesamte Prozess verwechselt die Datei herunterzuladen (da Header gesammelt werden, erzeugt in einem Header und dann an den Browser gesendet, können Sie versuchen, diese durch mehrere Redirect-Header IIRC Einstellung)

Beachten Sie jedoch die automatische Einleitung von herunterladbaren Dateien für IE-Benutzer wird die Sicherheitswarnung Registerkarte auslösen. Alle drei der von daremon skizzierte Verfahren würden diese Warnung zeigen. Sie können einfach nicht dieses Problem umgehen. Sie werden besser gedient, wenn Sie echte Links bieten.

fand ich eine Abhilfe für dieses, das auf Javascript angewiesen ist, so ist es nicht genau sicher, aber für nicht sichere kritischen Stellen scheint es zu funktionieren.

Haben Sie ein Formular mit einem Button dem Titel ‚Download‘ mit der Aktion auf die Download-Skript verweisen, dann mit Hilfe von Javascript setzen etwas auf dem onsubmit-Handler, der den Download-Button abstreift und ersetzt die Nachrichten auf dem Bildschirm. Der Download sollte noch passieren, und der Bildschirm wird sich ändern. Offensichtlich, wenn es ein Problem mit der Download-Skript dann noch sieht es aus wie der Download erfolgreich war, auch wenn es nicht schießen, aber es ist die beste, das ich jetzt habe.

Das ist ganz altes Thema, aber hier ist, wie ich es über JS erreicht.

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

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

Hier ist eine Lösung mit Hilfe von JavaScript.

Sie können auf die URL versuchen und umleiten und einen Parameter, der den Inhalt der Datei darstellt. Und in der Umleitung können Sie Ausgabe des Dateiinhalt zum Download bereit.

Starten Sie die PHP-Datei, die den CSV-Download enthält mit:

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

oder

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

Dabei steht die JavaScript-Funktion popoutWin ist

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

Dies wird ein Fenster geöffnet, die CSV-Download-Eingabeaufforderung angezeigt und dann sofort das Fenster schließen, nur die Eingabeaufforderung zu verlassen.

Hier ist die Antwort:
Es ist Arbeit!
Sie müssen drei verschiedene Teile des Codes:
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 ...

Setzen Sie den Code unten in der Haupt javascript der Website.

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

Erklären: Es macht den normalen Umleitung mit PHP zu einem gewissen URL wird difine Sie und in JavaScipt heißt es: Wenn der Pfad der gleiche wie der Pfad, der ‚/ url_of_redirect /‘ dann öffnet es die URL auf einer neuen Seite, die Erzeugung der downlod gemacht umleiten.

scroll top