Gunther: [PHP] 'on the fly' erzeugte Datei zum Download anbieten

Hallo werte Selfgemeinde!

Bevor ich mich erstmalig an diese Aufgabenstellung heranbegebe, möchte ich im Vorfeld gerne fragen, welcher Ansatz denn wohl der einfachste/ eleganteste/ beste ist.

Folgende Aufgabenstellung:
Ich erzeuge per PHP eine Text-Datei - soweit so gut. ;-)
Sinn & Zweck der Übung ist es, dass sich der User diese Datei downloaden kann.

Frage:
Muss ich (damit man die Datei downloaden kann) die Datei zwingend als Datei erst irgendwo auf dem Server ablegen um dann bspw. per Link den Download bereitzustellen, oder geht das auch 'on the fly'?

Zur Info: Es genügt, wenn die Datei einmalig zum Download angeboten wird - ein späterer (erneuter) Zugriff ist nicht erforderlich.

Wie löse ich also die Aufgabe konzeptionell am besten?

Für eure Hilfe wie immer meinen besten Dank im Voraus!

Gruß Gunther

  1. Wie löse ich also die Aufgabe konzeptionell am besten?

    sende den quelltext der datei einfach direkt an den browser und vergib einen entsprechenden mime-type

    ob du eine grafik, eine zip-datei oder html generierst, ist egal

    es ist nicht notwendig, irgendwas zwischenzuspeichern

    1. Hi suit!

      Wie löse ich also die Aufgabe konzeptionell am besten?
      sende den quelltext der datei einfach direkt an den browser und vergib einen entsprechenden mime-type

      OK, danke! ;-)

      Gruß Gunther

  2. Hallo Gunther,

    ... oder geht das auch 'on the fly'?

    Ja, sende einen entsprechenden Header und gib den Inhalt mit echo aus:

    header("Content-Type: text/plain; charset=[ZEICHENSATZ]");  
    header("Content-Disposition: attachment; filename=[DATEINAME]");  
    header("Accept-Ranges: bytes");  
    header("Content-Length: [LÄNGE DES INHALTS]");  
    echo $inhalt;
    

    Alex

    1. Hallo Alex,

      ... oder geht das auch 'on the fly'?

      Ja, sende einen entsprechenden Header und gib den Inhalt mit echo aus:

      header("Content-Type: text/plain; charset=[ZEICHENSATZ]");

      header("Content-Disposition: attachment; filename=[DATEINAME]");
      header("Accept-Ranges: bytes");
      header("Content-Length: [LÄNGE DES INHALTS]");
      echo $inhalt;

        
      aber ist  
      ~~~php
        
      header("Content-Disposition: attachment; filename=[DATEINAME]");
      

      nicht genau der Fall, dass ich meine Datei vorher irgendwo auf dem Server ablegen müsste, damit anschließend von dort darauf zugegriffen werden kann?
      (Das ist nämlich genau einer der Punkte, weshalb ich mangels Wissen und Erfahrung hier nachgefragt habe ;-) ).

      Gruß Gunther

      1. Hallo,

        header("Content-Disposition: attachment; filename=[DATEINAME]");

        
        > nicht genau der Fall, dass ich meine Datei vorher irgendwo auf dem Server ablegen müsste,  
          
        nein. Es ist eine Empfehlung an den Browser, welchen Dateinamen er beim Abspeichern vorschlagen soll.  
          
          
        Freundliche Grüße  
          
        Vinzenz
        
  3. Hallo nochmal!

    Dank eurer (suit, Alex, Vinzenz) netten und schnellen Hilfe funktioniert das soweit.

    Wenn ich das allerdings etwas anders machen möchte, dann habe ich (mind.) ein Problem, das ans Laufen zu bringen.

    Und zwar soll die downzuloadende Datei durch einen AJAX Request in einer PHP Datei erzeugt werden. Nun erhalte ich den Inhalt meiner Datei ja als AJAX Response und diese wird nicht zum Download angeboten.
    (Sorry, für die evt. nicht ganz korrekte Bezeichnung/ Ausdrucksweise, aber Javascript und AJAX sind nicht mein Spezialgebiet. Ich hoffe, es ist dennoch verständlich, was ich meine und worum es mir geht?)

    Frage: Wie löse ich diese (neue) Anforderung denn am besten?

    Gruß Gunther

    1. Hi,

      Und zwar soll die downzuloadende Datei durch einen AJAX Request in einer PHP Datei erzeugt werden. Nun erhalte ich den Inhalt meiner Datei ja als AJAX Response und diese wird nicht zum Download angeboten.

      Frage: Wie löse ich diese (neue) Anforderung denn am besten?

      In dem du auf AJAX verzichtest, und einen "ganz normalen" Request ausloest, auf den hin der Server dann die "Datei" zurueckschicken kann ...?

      (Sorry, für die evt. nicht ganz korrekte Bezeichnung/ Ausdrucksweise, aber Javascript und AJAX sind nicht mein Spezialgebiet. Ich hoffe, es ist dennoch verständlich, was ich meine und worum es mir geht?)

      Wie waer's denn dann mit erst mal Finger von AJAX lassen, bis etwas mehr Ahnung vorhanden?

      MfG ChrisB

      --
      „This is the author's opinion, not necessarily that of Starbucks.“
      1. Hi,

        Und zwar soll die downzuloadende Datei durch einen AJAX Request in einer PHP Datei erzeugt werden. Nun erhalte ich den Inhalt meiner Datei ja als AJAX Response und diese wird nicht zum Download angeboten.

        Frage: Wie löse ich diese (neue) Anforderung denn am besten?

        In dem du auf AJAX verzichtest, und einen "ganz normalen" Request ausloest, auf den hin der Server dann die "Datei" zurueckschicken kann ...?

        OK. Ich stimme dir prinzipiell zu. Allerdings handelt es sich bei der Seite ja gerade um eine "Test-/ Spielwiese" für mich, um meine stark zurückgebliebenen Javascript Kenntnisse etwas aufzufrischen. Nebenbei ist die Seite eine kleine Hilfestellung für vlt. 5-10 User.

        Die Seite setzt auch zwingend Javascript beim Client voraus.
        Bevor ich das lang und breit beschreibe, hier mal der Link: http://siedler-aek.de/generator/

        Bitte dran denken: Rein privater Übungsplatz, weder fertig, noch sonst irgendetwas.

        Nun ist es so, dass ich auch eine Prüfung der vom User eingestellten Konfiguration (Button 'Test') per AJAX eingebaut habe, die sogar funktioniert.

        Der Gedanke war weiters halt, dass vor dem generieren der downloadbaren Datei auch erst die Prüfung durchlaufen wird, und die Datei nur dann überhaupt generiert wird, wenn es keine 'kritischen Fehler' gibt.

        Deshalb hätte ich die Download-Geschichte halt auch gerne über AJAX realisiert.

        (Sorry, für die evt. nicht ganz korrekte Bezeichnung/ Ausdrucksweise, aber Javascript und AJAX sind nicht mein Spezialgebiet. Ich hoffe, es ist dennoch verständlich, was ich meine und worum es mir geht?)

        Wie waer's denn dann mit erst mal Finger von AJAX lassen, bis etwas mehr Ahnung vorhanden?

        Na ja. Als reiner Autodidakt suche ich mir halt meist einen konkreten Anwendungsfall und versuche mir alle erforderlichen Puzzleteilchen zusammenzusuchen, bis das Puzzle komplett ist, bzw. die Aufgabe gelöst. So ist über die Jahre zumindest in einigen Bereichen wenigstens ein gewisses Grundwissen angewachsen.
        Wenn also etwas grundsätzlich "lösbar" ist, dann würde ich schon gerne wissen wie, und es nicht erstmal links liegen lassen. Und von irgendeiner Seite muss ich das "AJAX-Ungetüm" ja auch mal angehen. ;-)

        Mir würde es für den Anfang ja schon mal sehr weiterhelfen, wenn mir jemand sagen könnte,

        • ob es generell geht?
        • wenn ja, nach welchen Stichworten ich mal suchen muss?

        Gruß Gunther