Frage

Auf einer PHP-basierten Web-Site, ich möchte Benutzer ein Download-Paket senden, nachdem sie ein kurzes Formular ausgefüllt haben. Die Website initiierter Download sollte wie download.com auf Websites ähnlich sein, die sagen: „Ihr Download in einem Moment beginnen.“

Ein paar möglicher Ansätze Ich weiß, über, und Browser-Kompatibilität (basierend auf einem Schnelltest):

1) Führen Sie eine window.open in die neue Datei verweist.

- FireFox 3 blocks this.  
 - IE6 blocks this.  
 - IE7 blocks this.

2) ein iframe erstellen in die neue Datei verweist.

- FireFox 3 seems to think this is OK. (Maybe it's because I already accepted it once?)  
 - IE6 blocks this.  
 - IE7 blocks this.

How can I do this so that at least these three browsers will not object? 

Bonus: Gibt es eine Methode, die nicht Browser-bedingte Anweisungen erfordert?

(Ich glaube, dass download.com bedingt beide Methoden beschäftigt, aber ich kann nicht bekommen entweder zu arbeiten.)

Antworten und Erläuterungen:

Q: "Why not point the current window to the file?"  
A: That might work, but in this particular case, I want to show them some other content while their download starts - for example, "would you like to donate to this project?"

UPDATE: Ich habe diesen Ansatz aufgegeben. Siehe meine Antwort unten Gründe.

War es hilfreich?

Lösung

Sie können auch ein Meta-Refresh tun, die die meisten Browser unterstützen. Download.com legt man in einem noscript-Tag.

<meta http-equiv="refresh" content="5;url=/download.php?doc=123.zip"/>

Andere Tipps

Update: Ich habe beschlossen, diesen Ansatz aufzugeben und stattdessen nur den Benutzer mit einem Link zu der eigentlichen Datei präsentieren. Meine Argumentation ist folgende:

Meine ersten Versuche auf einem Server initiierten Download wurden vom Browser blockiert. Das hat mir denken: „der Browser richtig Wie funktioniert es wissen, dass dies ein legitimer Download Es sollte blockieren einen Download, der nicht offensichtlich vom Nutzer initiiert ist.?. „

Jede Methode, die ich für einen Server-initiierten Download verwenden kann, könnte auch von jemandem verwendet werden, der will, Malware senden. Daher Downloads sollte nur dann geschehen, wenn der Benutzer speziell die Datei anfordert, indem er für sie auf einen Link klicken.

Du bist frei, andere Meinung zu sein, und wenn Sie noch einen Download starten wollen, hoffentlich dieses Thema werden Ihnen helfen, es zu tun.

Ich habe in der Regel nur ein PHP-Skript, das die Datei an den Browser direkt ausgibt, mit dem entsprechenden Content-Type

if(file_exists($filename)) {
    header("Pragma:  public");
    header("Expires:  0");
    header("Cache-Control:  must-revalidate, pre-check=0");
    header("Cache-Control:  private", false);
    header("Content-Type:  " . $content-type);
    header("Content-Disposition:  attachment; filename=\"" . basename($filename) . "\";" );
    header("Content-Transfer-Encoding:  binary");
    header("Content-Length:  " . filesize($filename));

    readfile("$filename");
}else{
    print "ERROR:  the file " . basename($filename) . " could not be downloaded because it did not exist.";
}

Der einzige Nachteil ist, dass, da dies den HTTP-Header setzt, hat es sich, bevor Sie eine andere Ausgabe haben genannt werden.

Sie können aber einen Link auf die PHP-Download-Seite und es wird der Browser einen Download-Box ohne vermasselt den Inhalt der aktuellen Seite Pop-up.

Ein Haken ist, dass Sie Probleme mit IE (Version 6 insbesondere) auftreten können, wenn die Header werden nicht eingerichtet „richtig“.

Stellen Sie sicher, Sie den richtigen Content-Type gesetzt, aber bedenken Sie auch die Cache-Optionen für IE-Einstellung (mindestens) bis erlauben Caching. Wenn die Datei kann man sich der Benutzer öffnen, anstatt speichern (zB eine MS Word-Dokument) frühe Versionen von IE die Datei zwischengespeichert werden müssen, da sie die „offene“ Anfrage an die geltenden App Hand aus, um die Datei verweist, die heruntergeladen wurde im Cache.

Es gibt auch ein ähnliches Problem, wenn der Cache des IE6 Benutzer voll ist, wird es nicht richtig speichern Sie die Datei (also wenn die geltenden App aus der Hand wird es zu öffnen, wird es beklagen die Datei beschädigt ist.

Sie können auch zu einer gzip Aktionen auf den Download aktivieren möchten (für IE)

IE6 / IE7 beide haben Probleme mit großen Downloads (z 4.x Gigs ...) nicht ein wahrscheinliches Szenario, da IE hat noch nicht einmal einen Download-Manager, sondern etwas bewusst zu sein.

Schließlich IE6 manchmal nicht schön einen Download „Push“ handhaben, wenn er innerhalb eines verschachtelten iframe initiiert wurde. Ich bin mir nicht ganz sicher, was das Problem löst, aber ich finde es einfacher, mit IE6 ist dieses Szenario zu vermeiden.

Hoi!

@Nathan: Ich beschloss, genau das zu tun: Habe meine „getfile.php“ load alle notwendigen Sachen und führen Sie dann ein

header("Location: ./$path/$filename");

Der Browser selbst zu lassen und direkt tun, was sie denkt, ist korrekt mit der Datei tun. Dies funktioniert auch fein in Opera mit mir.

Aber das wird ein Problem in Umgebungen, wo kein direkter Zugriff auf die Dateien erlaubt ist, in diesem Fall wird man einen anderen Weg finden müssen! (Danke Discordia meine Dateien sind öffentliche PDFs!)

Mit freundlichen Grüßen, Basty

Wie wäre die Lage zu ändern, um die neue Datei zu zeigen? (Beispielsweise durch Ändern window.location)

Ich habe immer nur ein iframe gemacht, die auf die Datei verweist.

<iframe src="/download.exe" frameborder="0" height="0" width="0"><a href="/download.exe">Click here to download.</a></iframe>

In Bezug auf das aktuelle Fenster nicht auf die Download-Hinweis. Nach meiner Erfahrung kann man noch zeigen Sie Ihre Seite „Bitte spenden“, da Downloads (solange sie die richtigen Header senden) nicht tatsächlich aktualisieren Sie das Browserfenster. Ich tue dies für csv Exporte auf einem meiner Seiten, und soweit der Benutzer betrifft es öffnet nur ein sicheres Datei-Fenster. So würde empfehle ich eine einfache Meta-Umleitung als Soldarnal zeigte.

Just zusammenzufassen, Sie haben zwei Ziele:

  1. Start Download-Prozess
  2. zeigen Benutzer eine Seite mit einer spenden Optionen

Um dies zu erreichen, würde ich Folgendes tun:

Wenn Ihre Benutzer das Formular sendet, erhält er die resultierende Seite mit spenden Optionen und einem Text sagen, dass sein Download startet in 5 Sekunden wird. Und im Kopfteil dieser Seite legen Sie den META-Code als Soldarnal sagte:

<a href="normaldownload.zip" onclick="use_dhtml_or_ajax_to_display_page()">

Aktuelle Seite ist nicht betroffen, wenn Download gespeichert wird. Einfach sicher, dass Download nicht im selben Fenster (richtiger MIME-Typ oder Content-Disposition) öffnet und Sie in der Lage sein, etwas zu zeigen.

Weitere vollständige Antwort

Sie können Javascript / jQuery verwenden um den Download zu starten. Hier ist ein Beispiel -. Sie loszuwerden, die Ajax-Anfrage erhalten und benutzen Sie einfach die setTimeout () Block

$("btnDownloadCSV").on('click', function() {
    $.ajax({
        url: "php_backend/get_download_url",
        type: 'post',
        contentType: "application/x-www-form-urlencoded",
        data: {somedata: "somedata"},
        success: function(data) {
            // If iFrame already exists, remove it.
            if($("[id^='iframeTempCSV_"]).length) { 
                $("[id^='iframeTempCSV_"]).remove();
            }
            setTimeout(function() {
                //  If I'm creating an iframe with the same id, it will permit download only the first time.
                // So randHashId appended to ID to trick the browser.
                var randHashId = Math.random().toString(36).substr(2);
                // Create a fresh iFrame for auto-downloading CSV
                $('<iframe id="iframeTempCSV_'+randHashId+'" style="display:none;" src="'+data.filepath+'"></iframe>').appendTo('body');
            }, 1000);
        },
        error: function(xhr, textStatus, errorThrown) {
           console.error("Error downloading...");
       }
    });
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top