Javascript/AJAX/PHP: Wie eine Datei downloaden die erst erstellt werden muss?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Javascript/AJAX/PHP: Wie eine Datei downloaden die erst erstellt werden muss?

    Hi,

    ich habe eine Webseite mit einem Button "Export". Wird dieser angeklickt, muss ein PHP Script aufgerufen werden, welches aus einer DB Daten holt und diese zu einer Datei zusammen bastelt. Wenn das erledigt ist, sollte die fertige Datei an den Client geschickt werden.

    Für den User muss es also so aussehen:

    Klick auf den Button -> Irgendein Popup öffnet sich in dem steht "Erstelle Datei..." -> Das Popup verschwindet und der Browser-Typische Requester zur Auswahl was man mit einer Downloaddatei anstellen will geht auf (oder auch gar nicht wie beim Safari, der es ja einfach direkt nach DownLoads speichert) und die Datei wird runtergeladen.

    Ich mache im Moment folgendes

    Button -> onClick() -> Es wird das Warten-Popup geöffnet und per AJAX das PHP File angeworfen dass die Datei erzeugt. Soweit so gut. Wie mache ich jetzt aber weiter? Soll das PHP File dann den Filenamen der Datei an AJAX zurück schicken und ich mache dann einfach ein location.href auf die Datei? Das hat den Nachteil, dass ich die Datei dann als Leiche auf dem Server liegen habe, es sei denn ich schicke nach dem download nochmal ein php script ab das diese Datei löscht (Was ein gehampel). Ausserdem müßte ich die Datei dann auch noch vor unberechtigten Zugriffen schützen.
    Oder sollte ich die Datei gar nicht im PHP erzeugen sondern nur die Daten der Datei zurück an AJAX schicken und das speichert dann die Datei irgendwohin. Dazu bräuchte ich dann aber sowas wie einen filerequester oder wie geht das?

    Oder hat vielleicht jemand noch ganz andere Ideen? Vielleicht denke ich ja total falsch gerade.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Wir haben das hier so:
    - Background task, der das File erstellt (kein PHP, weiss nicht, ob/wie man soetwas mit PHP machen kann)
    - Forward auf die "Bitte Warten Seite" (alternativ Popup - ich mag aber keine Popups) mit einer ID vom Background task
    - "Bitte warten" Seite macht regelmässig (setTimeout()) AJAX anfragen, ob der Task abgeschlossen ist
    - Wenn, dann kommt per JSON vom Background Task eine temporäre URL und der Download-link wird ins DOM eingefügt
    (alternativ: JavaScript forward auf Download link, sollte dann einfach den Download starten, ohne die Seite zu wechseln)
    C++
  • Noch eine ganz blöde Frage.

    Ich bekomme von meinem PHP Script jetzt z.B. einen Filenamen der in einem temp Verzeichnis liegt ala

    egal.csv

    Wie kann ich nun erreichen, dass ich aus Java heraus die Seite nicht anzeige sondern direkt downloade?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • gritsch schrieb:

    Thallius schrieb:

    Noch eine ganz blöde Frage.

    Ich bekomme von meinem PHP Script jetzt z.B. einen Filenamen der in einem temp Verzeichnis liegt ala

    egal.csv

    Wie kann ich nun erreichen, dass ich aus Java heraus die Seite nicht anzeige sondern direkt downloade?

    Gruß

    Claus


    JavaSCRIPT, nicht java ;)


    Das war autokorrektur. Ich schwöre :)


    ein einfaches window.location = "url zum file"; sollte doch reichen oder?


    Ne, dann zeigt er ein .csv ja an. Bei einem .exe würde es klappen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    Naja aber eine csv datei hat doch gar keinen HTTP-Header...

    Jeder HTTP-Response hat einen Header; das legt das Protokoll so fest ;)

    Wenn Dein Webserver eine Datei ausliefert, packt er auch immer einen Header davor. Du kannst Dir auch einfach eine PHP-Seite schreiben, die den Header ausgibt, die Daten aus der Datei liest und diese Daten nach dem Header rauspumpt.

    Damit könntest Du übrigens auch recht einfach das Problem der Dateileichen lösen, indem die PHP-Seite im letzten Schritt die Datei löscht.
    „Meine Komplikation hatte eine Komplikation.“
  • Du kannst über das über den HTTP-Header Content-Disposition beeinflussen; z. B.:


    So meinte ich das.

    Und so sollte das auf alle Fälle ein Download werden, jedenfalls ungefähr:

    Quellcode

    1. $data; // deine generierten daten fuer den export die du normalerweise in die datei schreibst
    2. header("Content-Description: File Transfer");
    3. header("Content-Length: ". strlen($data));
    4. header("Content-Disposition: attachment; filename=blablub.typ");
    5. header("Content-Type: application/octet-stream; ");
    6. header("Content-Transfer-Encoding: binary");
    7. print($data);
    8. flush()
    Alles anzeigen
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Danke euch,

    ich werde damit mal ein wenig rumspielen. Ausserdem hat es mir gezeigt, dass ich wohl nicht mehr drum herum komme mir das HTT-Protokoll mal genauer durchzulesen (Ich hasse so theoretischen Kram aber manchmal geht es wohl nicht anders). Kennt jemand da gute Literatur zu?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • gritsch schrieb:

    Thallius schrieb:

    Danke euch,

    ich werde damit mal ein wenig rumspielen. Ausserdem hat es mir gezeigt, dass ich wohl nicht mehr drum herum komme mir das HTT-Protokoll mal genauer durchzulesen (Ich hasse so theoretischen Kram aber manchmal geht es wohl nicht anders). Kennt jemand da gute Literatur zu?

    Gruß

    Claus


    wozu?


    Naja, wie so ein HHTP aufgebaut ist, was es da für verschiedene MIME- und Content-Types gibt wie man damit umgeht etc. Das ist für mich alles bömische Dörfer
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Eine Kurzeinführung findest Du hier. Im Prinzip hat gritsch schon recht: Da kann man nicht viel zu lesen. Man muss den Grundaufbau verstehen und der ist relativ simpel. Wenn Du Infos zu einem bestimmten Header haben willst, kannst Du beispielsweise in den RFC schauen. Den würde ich aber niemals ganz lesen. Da ist ja ein Telefonbuch spannender. ;)
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Eine Kurzeinführung findest Du hier. Im Prinzip hat gritsch schon recht: Da kann man nicht viel zu lesen.

    Nicht viel lesen = gut :)


    Man muss den Grundaufbau verstehen und der ist relativ simpel. Wenn Du Infos zu einem bestimmten Header haben willst, kannst Du beispielsweise in den RFC schauen. Den würde ich aber niemals ganz lesen. Da ist ja ein Telefonbuch spannender. ;)


    Das war meine Befürchtung :)

    Danke

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • nochmal ganz zu Anfang deiner Frage.
    Es gibt über Ajax einen Anfrage, diese erstellt die Datei. Du kennst den Pfad. Dieser Pfad sollte nicht von außen erreichbar bzw. erahnbar sein (über eine URL).
    Die Ajax-Rückmeldung enthält einen Hinweis auf den Pfad (SessionID, oder ähnliches).
    Dann machst Du einen location Wechsel auf zum Beispiel getDatei.php?ID=sdfjsadrf32we
    In der getDatei.php:
    Dann einen entsprechenden csv Header/Download-Anstoß Header
    und mit file_get_contents gibts Du dann die entsprechende Datei aus, dabei sicherstellen, dass man der getDatei.php irgendwas unterjubeln kann, was dann deine eigenen php-Scripts als Quelltext zurückgibt.