Max Smily: dynamischer Download per header

Hallo Forum,

ich habe ein Download-Tool erstellt, welches die Downloads per header() und readfile() ausführt. Dies ist nötig, weil für jeden Download vorab einige Funktionen ausgeführt werden müssen und auch ein direkter Link zur Datei nicht erlaubt sein soll. Das Script holt anhand der Datei-Id alle nötigen Pfade etc. und führt im Kern dann dies aus:

header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename="$save_as_name"");
// weitere Cacheheader wegen Übersichtlichkeit ausgelassen
readfile($filename);

Das funktioniert alles sehr gut. Allerdings muss ich für diese Ausgabe ein neues Browserfenster öffnen (z. Zt. ein kleines Javascript-Popup), welches keine HTML-Ausgabe haben darf, da dies mit den oben genannten Headern kollidieren würde. Genau das stört mich aber. Ich möchte bei jedem Download-Link sofort den Speicherdialog haben, ohne ein Pop-Up bzw. neues Browserfenster. Es soll also nach Klick auf den Download-Link die Dateiliste neu aufgebaut werden und auch der Download starten, also zwei Headertypen abgearbeitet werden.

Ich erinnere mich, dass bei dynamischen Grafiken auch zwei Header verarbeitet werden, der normale für die HTML-Ausgabe und einer für das Bild im IMG-Tag. Geht das auch bei meinem Problem. Ich bitte um hilfreiche Tipps... Danke

Grüße aus Berlin
Max Smily

  1. Hallo Max
    genau für den umgekehrten Fall (anzeigen erzwingen)
    habe ich weiter unten in einem anderen Thread ein
    Beispiel gemacht.

    Daraus kannst du das bestimmt für deine Zwecke ableiten.

    https://forum.selfhtml.org/?t=134788&m=875309

    Gruss
    Wolke

    1. Hi Wolke,

      danke für deinen Hinweis, aber ich glaube das ist es nicht. Du hast zwar verschiedene Ausgaben in einer Datei drin, ausgegeben wird aber immer nur ein Abschnitt/Element (dein Bild oder deine Liste).

      Ich brauche eine Lösung, die sowohl normales HTML ausgibt und gleichzeitig auch einen dynamischen Download startet.

      Ein dynamisch generiertes Bild kann man ja in ein IMG-Tag ausgeben, indem man als src das generierende Script angibt. Der Rückgabewert des Scripts wird z.B. mit einem JPG-Header eingeleitet und dann die Bilddaten gestreamt. Sowas will ich für meine Downloaddateien haben, nur dass diese Dateien alles sein können (Textfiles, PDFe, Bilder, EXE, ZIP usw.).

      Grüße Max

      1. Ich brauche eine Lösung, die sowohl normales HTML ausgibt und gleichzeitig auch einen dynamischen Download startet.

        Verstehe ich das richtig?

        Besucher befindet sich auf einer Seite
        -> klickt weiter zu seite 2
        -> Jetzt öffnet seite 2 als HTMLDokument

        • und gleichzeitig soll der Download beginnen?
        1. Hi Wolke,

          Besucher befindet sich auf einer Seite
          -> klickt weiter zu seite 2
          -> Jetzt öffnet seite 2 als HTMLDokument

          • und gleichzeitig soll der Download beginnen?

          so ähnlich:

          • Besucher ist auf Seite mit Downloadliste
          • er wählt einen Download aus
          • es startet der Download durch Klick auf den Link
          • es öffnet sich die Speicheraufforderung, ohne dass sich ein neues Fenster öffnet, oder die alte Downloadliste verschwindet.

          Da der Download vom Benutzer per Link angefordert wird, muss es ja eine Rückgabe vom Server an den Browser geben. Diese kommt in Form der zu ladenden Datei. Das Browserfenster erhält einen Header für den Dateidownload, aber keinen für eine (neue oder alte) HTML-Seite. Daher verschwindet meine Downloadliste und wird durch einen weißen Screen ersetzt. Ich will aber, dass die Downloadliste bleibt.

          Grüße Max

          1. Hallo Max,

            • Besucher ist auf Seite mit Downloadliste
            • er wählt einen Download aus
            • es startet der Download durch Klick auf den Link
            • es öffnet sich die Speicheraufforderung, ohne dass sich ein neues Fenster öffnet, oder die alte Downloadliste verschwindet.

            das ist eigentlich das übliche Verhalten, ohne dass du etwas Konkretes dafür tust.

            Das Browserfenster erhält einen Header für den Dateidownload, aber keinen für eine (neue oder alte) HTML-Seite. Daher verschwindet meine Downloadliste und wird durch einen weißen Screen ersetzt.

            Ups? Was hast du mit deinem Browser angestellt? Sämtliche mir bekannten Browser (IE, Firefox, Opera) lassen die bisher angezeigte Seite unverändert stehen, wenn sie die vom Server gelieferte Ressource nicht darstellen können, bzw. diese mit application/octet-stream ausgeliefert wird. Dass dabei der bisherige Fensterinhalt verschwindet, hab ich noch nicht erlebt.
            Es kann höchstens passieren, dass ein _zusätzliches_ leeres Browserfenster übrigbleibt - dann nämlich, wenn man den Download-Link anklickt und "Im neuen Fenster öffnen" wählt. Normalerweise fällt dem IE dann irgendwann auf, dass das neu geöffnete Fenster sinnlos ist, und er schließt es sofort wieder. Manchmal "vergisst" er das aber. Wie die anderen Browser auf diesen Fall reagieren, weiß ich nicht.

            Schönen Abend noch,
             Martin

            --
            F: Was macht ein Offizier, der in der Nase bohrt?
            A: Er holt das Letzte aus sich heraus.
            1. Hallo Martin,

              das war der rettende Hinweis, danke! Auf dein Post hin, hab ich mir meinen Quelltext nochmal genau vorgenommen und tatsächlich, der Seiteninhalt bleibt stehen - wie schön! Ich hab mir selbst das Leben schwer gemacht, indem ich einige Javascripte mit onClick ausgelöst habe, die die Seite refreshen usw. Die haben dann zum beschriebenen Browserverhalten geführt. Auf einer irrigen Annahme basieren dann weitere und man sieht den Wald vor Bäumen nicht mehr.

              Vielen Dank an Wolke und Martin.

              Grüße
              Max