it-swarm.com.de

PHP Datei zum Download generieren, dann umleiten

Ich habe eine PHP App, die eine CSV-Datei erstellt, die mithilfe von Headern zum Herunterladen gezwungen wird. 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(); 

Ich möchte die Benutzer auf eine neue Seite umleiten, nachdem die Datei erstellt wurde und die Download-Eingabeaufforderung gesendet wurde. Das Hinzufügen von header("Location: /newpage") am Ende funktionierte nicht wie erwartet, daher bin ich mir nicht sicher, wie ich das aufstellen soll.

58
Evan

Ich glaube nicht, dass dies möglich ist - obwohl ich nicht zu 100% sicher bin.

Die übliche Sache (z. B. auf beliebten Downloadseiten) ist das Gegenteil: Sie gehen zuerst zur Seite after und dann beginnt der Download.

So leiten Sie Ihre Benutzer auf die Seite final um, auf der (unter anderem) Folgendes steht:

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

Zum Starten des Downloads (z. B. zum automatischen Aufruf von 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]
81
daremon

sehr einfach zu machen, falls es wirklich nötig ist.

Sie müssen jedoch ein wenig mit JavaScript und Cookies arbeiten:

in PHP sollten Sie das Einrichten eines Cookies hinzufügen

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

dann sollten Sie auf der Seite, auf der Sie den Download aufrufen, mit JS nachverfolgen (z. B. einmal pro Sekunde), ob ein solches Cookie kommt (es wird ein Plugin jQuery Cookie hier verwendet):

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

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

Wenn die Datei nun herunter geladen wird, erkennt JS sie und leitet auf die Seite um, die nach dem Löschen des Cookies erforderlich ist.

Natürlich können Sie feststellen, dass Sie einen Browser benötigen, um Cookies, JavaScript usw. zu akzeptieren, aber es funktioniert.

9
smnbbrv

Der Header, den Sie senden, sind HTTP-Header. Der Browser nimmt dies als Seitenanfrage an und verarbeitet es als Seite. Und in Ihrem Fall eine Seite, die heruntergeladen werden muss.

Das Hinzufügen eines Umleitungsheaders zu einem verwirrt den gesamten Prozess des Herunterladens der Datei (da Header gesammelt, in einem Header generiert und dann an den Browser gesendet werden, können Sie dies versuchen, indem Sie mehrere Umleitungsheader IIRC festlegen.

8
Ólafur Waage

Beachten Sie jedoch, dass das automatische Auslösen von herunterladbaren Dateien für Benutzer von IE die Sicherheitswarnung aktiviert. Alle drei von daremon beschriebenen Methoden würden diese Warnung anzeigen. Sie können das einfach nicht umgehen. Sie werden besser bedient, wenn Sie echte Links anbieten.

2
martar

Ich habe dafür eine Problemumgehung gefunden, die auf Javascript angewiesen ist. Daher ist es nicht unbedingt sicher, aber für nicht sichere kritische Websites scheint es zu funktionieren. 

Haben Sie ein Formular mit einer Schaltfläche mit dem Titel "Download", bei der die Aktion auf das Download-Skript zeigt. Setzen Sie dann mithilfe von JavaScript etwas auf den Onsubmit-Handler, der die Download-Schaltfläche entfernt und die Nachrichten auf dem Bildschirm ersetzt. Der Download sollte immer noch stattfinden und der Bildschirm ändert sich. Wenn es ein Problem mit dem Download-Skript gibt, scheint es immer noch so zu sein, dass der Download erfolgreich war, auch wenn er nicht startet, aber es ist das Beste, was ich jetzt habe.

1
Darren Crabb

Sie können versuchen, zur URL zu gelangen, sowie einen Parameter, der den Inhalt der Datei darstellt. In der Umleitung können Sie den Dateiinhalt zum Herunterladen ausgeben.

0
user1251795

Starten Sie die Datei PHP, 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\')" />

wo 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);
}

Daraufhin wird ein Fenster geöffnet, in dem die CSV-Download-Eingabeaufforderung angezeigt wird. Anschließend wird das Fenster sofort geschlossen, wobei nur die Eingabeaufforderung verbleibt.

0
Clinton

Hier ist die Antwort:
Es ist Arbeit!
Sie benötigen 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);
            }

        }
0
Hisham Dalal

Hmmmm ...

Fügen Sie den Code in das Haupt-Javascript der Website ein.

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

Erklären: Es führt die normale Weiterleitung mit PHP zu einer URL, die Sie definieren werden, und in Javascipt heißt es: Wenn der Pfadname dem Pfad der Weiterleitung '/ url_of_redirect /' entspricht, wird die URL auf einer neuen Seite geöffnet , das Downlod generieren. 

0
FernandoGiroto

Dies ist ein ziemlich altes Thema, aber so habe ich es mit 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);

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

0
Vaibhav Jain
<?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 Javascript.

0
nikksan