Henning Bösch: Ajax und readfile

Hallo,

ich habe mehrere Downloads auf einer Webseite. Beim Klick auf einen der Downloadbutton wird ein Javascript aufgerufen, das ein XMLHttpRequest erzeugt. Dieser Request bekommt als Parameter den Dateinamen des gewünschten Downloads übergeben und ruft ein PHP-Script auf. Der Parameter wird per Post übergeben. Die Parameter kommen in diesem Script auch korrekt an.

Nun will ich die Datei (diese sind meistens vom Typ application/pdf bzw. text/plain) zurückgeben.

readfile($Pfad_und_Dateiname);

Der Mime-Type wurde vorher mit http_request.overrideMimeType entsprechend gesetzt.

Ist es irgendwie möglich diese Datei so zurückzugeben? Mit responseText geht dies anscheinend nicht, zumindest nicht mit den PDFs.

Gruß,
Henning

  1. Moin!

    Nun will ich die Datei (diese sind meistens vom Typ application/pdf bzw. text/plain) zurückgeben.

    Was soll Javascript im Browser mit einem PDF anfangen? Das ist sinnlos. Es kann nicht gespeichert und nicht angezeigt werden.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hallo,

      Was soll Javascript im Browser mit einem PDF anfangen? Das ist sinnlos. Es kann nicht gespeichert und nicht angezeigt werden.

      JavaScript soll mit diesen Dateien ja eigentlich gar nichts anfangen. Sie sollen gespeichert bzw. angezeigt werden ohne das die Seite verlassen werden soll (zumindest im ersten Fall). Einen direkten Link kann ich nicht anbieten, da die Dateien in Verzeichnissen liegen, die außerhalb des www-Bereichs liegen.

      Gruß,
      Henning

      1. Hallo Henning,

        JavaScript soll mit diesen Dateien ja eigentlich gar nichts anfangen. Sie sollen gespeichert bzw. angezeigt werden ohne das die Seite verlassen werden soll (zumindest im ersten Fall).

        Javascript kann aber keine Dateien oder Ressourcen speichern. Und wenn du sie per AJAX anforderst, sehe ich auch keine Möglichkeit, wie du sie dann anzeigen könntest.

        Einen direkten Link kann ich nicht anbieten, da die Dateien in Verzeichnissen liegen, die außerhalb des www-Bereichs liegen.

        Aha. Dann kannst du sie mit Javascript/AJAX auch nicht erreichen - da wird schließlich der gleiche Mechanismus benutzt. Ein ganz normaler HTTP-Request.

        So long,
         Martin

        --
        Wenn alle das täten, wass sie mich können,
        käme ich gar nicht mehr zum Sitzen.
        1. Hallo,

          Aha. Dann kannst du sie mit Javascript/AJAX auch nicht erreichen - da wird schließlich der gleiche Mechanismus benutzt. Ein ganz normaler HTTP-Request.

          Naja erreichen kann ich sie schon. Mittels des PHP-Scripts, das aufgerufen wird. So kann ich z.B. die Dateigröße zurückgeben:

          echo "".filesize("/pfad/zur/datei.pdf");

          Nur kann ich die PDF-Dateien selbst nicht zurückgeben. (Txt-Dateien schon um z.B. einen <textarea> damit zu füllen.)

          Gruß,
          Henning

          1. Moin!

            Naja erreichen kann ich sie schon. Mittels des PHP-Scripts, das aufgerufen wird. So kann ich z.B. die Dateigröße zurückgeben:

            echo "".filesize("/pfad/zur/datei.pdf");

            Nur kann ich die PDF-Dateien selbst nicht zurückgeben. (Txt-Dateien schon um z.B. einen <textarea> damit zu füllen.)

            AJAX wirkt keine Wunder. Man kann damit im Prinzip nur folgendes machen: Javascript kann Strings vom Server abrufen, ohne die angezeigte Seite zu wechseln.

            Deshalb funktionieren Textstrings, egal ob sie in Textdateien, HTML-Dateien oder durch PHP-Scripte generiert werden, ganz prima, weil Javascript mit Strings was anfangen kann. Allerdings: Eine Textdatei auf dem Server mit AJAX runterladen und dem Benutzer zum Speichern anbieten geht ebenfalls nicht. Man kann nur Dinge tun, die mit Strings in Javascript möglich sind.

            Ein PDF mit AJAX zu laden bringt deshalb absolut nichts. Den Dateiinhalt als String kann man nirgendwo sinnvoll anzeigen lassen, ein Speichern der Datei ist ebenfalls unmöglich, und ein Anzeigen mit einem PDF-Browser-Plugin würde ich als genauso unmöglich bezeichnen.

            Deshalb die simple Lösung: Wer seinen Besuchern PDF-Dateien zur Nutzung anbieten will, setzt ganz stinknormale Links auf diese Dateien. Wahlweise (wenn's denn unbedingt sein muß) mit target="_blank" im neuen Browserfenster. Und fertig.

            Bedenke außerdem, dass keine deiner AJAX-Spielereien von Suchmaschinen indiziert wird! Es ist daher absolut blödsinnig, ausschließlich AJAX als Seitennavigation zu verwenden. Alle Unterseiten werden nicht indiziert werden, weil Suchmaschinen kein Javascript können.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hallo,

              Bedenke außerdem, dass keine deiner AJAX-Spielereien von Suchmaschinen indiziert wird! Es ist daher absolut blödsinnig, ausschließlich AJAX als Seitennavigation zu verwenden. Alle Unterseiten werden nicht indiziert werden, weil Suchmaschinen kein Javascript können.

              Danke für die bisherigen Hilfen. Ich setze AJAX auch nur äußerst sparsam ein. Die Probleme damit (Bookmarks, Back-Button usw.) sind mir einigermaßen bekannt. Seitennavigation o.ä. mache ich damit gar nicht.

              Gruß,
              Henning

  2. Hi,

    Ist es irgendwie möglich diese Datei so zurückzugeben? Mit responseText geht dies anscheinend nicht, zumindest nicht mit den PDFs.

    Mit Ajax kann man nur Textdateien einlesen, keine Binärdateien. responseText enthält also nur die Daten bis zum 1. Auftreten eines Nullbytes.

    Man könnte sich zwar trotzdem eine Funktion schreiben, die die komplette Datei mit JS-only holt, aber sinnvoller wäre es (wenn überhaupt), die Binärdatei von einem serverseitigen Script in-the-fly zu encodieren und dann von JS wieder zu decodieren.

    Gruß, Cybaer

    --
    Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!