ingobar: Datei nicht auf Server sondern lokal speichern?

Hallo,

in meiner Anwendung kann ich nun endlich Daten auf den Server abspeichern und wieder lesen. Besser fände ich es aber, wenn der User die zu speichernde Datei irgendwo auf dem Computer speichern kann (das Programm läuft vor allem lokal auf einem Computer und nicht im Internet).

Wie kann ich das machen? Ich habe leider (trotz Suche bei google, hier und php.net) nichts finden können.

Bislang sieht mein Code so aus:

function write_curData($filename,$data) {
 $data = utf8_encode($data);
 $dirName = "savedData";
 $file = "./".$dirName."/".$filename.".txt";

if (!$handle = fopen($file, "w")) {
  echo "Kann die Datei $file nicht öffnen";
  exit;
 }
 if (!fwrite($handle, $data)) {
  echo "Kann in die Datei $file nicht schreiben";
  exit;
 }

fclose($handle);

echo ("Daten wurden geschrieben.");
}

write_curData($_POST['filename'],$_POST['data']);

Was und wie müsste ich ändern? Gibt es irgendwo ein Tutorial?

  1. Hi,

    in meiner Anwendung kann ich nun endlich Daten auf den Server abspeichern und wieder lesen. Besser fände ich es aber, wenn der User die zu speichernde Datei irgendwo auf dem Computer speichern kann (das Programm läuft vor allem lokal auf einem Computer und nicht im Internet).

    Wie kann ich das machen?

    Zunaechst mal ganz simpel: Verlinke das Script, welches die Daten ausgibt ...

    Ich habe leider (trotz Suche bei google, hier und php.net) nichts finden können.

    ... und suche nach "Download erzwingen" o.ae.

    MfG ChrisB

    1. Zunaechst mal ganz simpel: Verlinke das Script, welches die Daten ausgibt

      Hä? Verstehe ich nicht. Könntest du das mal erklären was du genau meinst?

      Ich habe leider (trotz Suche bei google, hier und php.net) nichts finden können.

      ... und suche nach "Download erzwingen" o.ae.

      Da habe ich jetzt sowas gefunden:

      Statt zur Datei zu linken, linke zum Downloadskript. In diesem sollte folgendes stehen:

      <?php
      $Datei = "PfadzurDatei/Dateiname.Dateiendung";
      $Dateiname = basename($Datei);
      $Größe = filesize($Datei);
      header("Content-Type: application/force-download");
      header("Content-Disposition: attachment; filename="$Dateiname"");
      header("Content-Length: $Größe");
      readfile($Datei);
      ?>

      Das heißt, dass ich die Datei auf dem Server erst erstelle und dann über das obige Skript den Download dieser frisch erzeugten Datei erzwinge?

      1. Hi,

        Zunaechst mal ganz simpel: Verlinke das Script, welches die Daten ausgibt

        Hä? Verstehe ich nicht. Könntest du das mal erklären was du genau meinst?

        Daten kommen aus dem WWW nicht einfach so auf meinen Rechner geflogen, sondern ich fordere sie an.
        Bei Webseiten in aller Regel dadurch, dass ich auf einen Link klicke.

        Das heißt, dass ich die Datei auf dem Server erst erstelle und dann über das obige Skript den Download dieser frisch erzeugten Datei erzwinge?

        Wenn du gar keine Datei auf dem Server haben willst, brauchst du dort auch nicht unbedingt erst eine zu erstellen - du kannst das Script die Daten natuerlich auch direkt an den Client ausgeben lassen, nachdem du zuvor die passenden Header gesendet hast.

        MfG ChrisB

        1. Guten Morgen,

          Bei Webseiten in aller Regel dadurch, dass ich auf einen Link klicke.

          das Schreiben wird bei mir über AJAX angestoßen. Geht das?

          Das heißt, dass ich die Datei auf dem Server erst erstelle und dann über das obige Skript den Download dieser frisch erzeugten Datei erzwinge?

          Wenn du gar keine Datei auf dem Server haben willst, brauchst du dort auch nicht unbedingt erst eine zu erstellen - du kannst das Script die Daten natuerlich auch direkt an den Client ausgeben lassen, nachdem du zuvor die passenden Header gesendet hast.

          Das hat leider irgendwie überhaupt nicht geklappt. Ich habe jetzt dies hier:

          $data = utf8_encode($data);
           $filename="test20080219_054356";
           header('Content-type: application/force-download');
           header('Content-Disposition: attachment; filename="' . $filename. '"');
           header("pragma: no-cache");
           header("expires: 0");

          readfile($filename);

          Dabei ist test20080219_054356 eine Datei, die ich mal zu testzwecken erzeugt habe. Ich hätte allerdings lieber den Fall, dass diese DAtei gar nicht erst erzeugt wird.

          Wie auch immer. Das einzige was bei mir passiert ist, dass ein Fenster aufgeht in dem der Inhalt aus der Datei steht.

          Könnte mit da einer nicht ein wenig mehr unter die Arme greifen?

          1. Hi,

            Bei Webseiten in aller Regel dadurch, dass ich auf einen Link klicke.

            das Schreiben wird bei mir über AJAX angestoßen.

            Und warum - weil's so "hipp" ist?

            Geht das?

            Vermutlich eher nicht - bzw. du kannst mit der Antwort des Servers wenig anfangen; Javascript kann naemlich keine Dateien auf dem Client erzeugen.

            Das hat leider irgendwie überhaupt nicht geklappt. Ich habe jetzt dies hier: [...]
            Dabei ist test20080219_054356 eine Datei, die ich mal zu testzwecken erzeugt habe. Ich hätte allerdings lieber den Fall, dass diese DAtei gar nicht erst erzeugt wird.

            Ja, dass man keine physische Datei auf dem Server braucht, wenn die Daten per Script dynamisch ermittelt werden, schrieb ich bereits.

            Wie auch immer. Das einzige was bei mir passiert ist, dass ein Fenster aufgeht in dem der Inhalt aus der Datei steht.

            Könnte mit da einer nicht ein wenig mehr unter die Arme greifen?

            Schau zunaechst nach, welche Header der Client erhaelt - bspw. mit der LiveHTTPHeaders-Exentsion fuer den Firefox oder mit FireBug.

            MfG ChrisB

            1. das Schreiben wird bei mir über AJAX angestoßen.

              Und warum - weil's so "hipp" ist?

              Nein. Ich simuliere eine Datenbanksystem und möchte die erzeugten Tabellen etc. in einem File speichern. Damit sich nicht die Anzeige ändert, habe ich AJAX benutzt.

              Vermutlich eher nicht - bzw. du kannst mit der Antwort des Servers wenig anfangen; Javascript kann naemlich keine Dateien auf dem Client erzeugen.

              Du meinst speichern, oder?

              Ja, dass man keine physische Datei auf dem Server braucht, wenn die Daten per Script dynamisch ermittelt werden, schrieb ich bereits.

              Aber leider nicht wie genau. Und anscheinend habe ich nicht genug Ahnung von der Sache als das ich deine Tipps so einfach umsetzen kann.

              Schau zunaechst nach, welche Header der Client erhaelt - bspw. mit der LiveHTTPHeaders-Exentsion fuer den Firefox oder mit FireBug.

              Ich versuche mal mit Firebug irgendwas herauszufinden....

              .. hat leider nichts gebracht. Ich kann so etwas wie LiveHTTPHeaders-Exentsion nirgends wo entdecken. Allerdings habe ich auch noch nie mit Firebug gearbeitet. Ich habe immer noch den selben Effekt: Es öffnet sich ein Fenster und es wird einfach der Inhalt der Datei angezeigt. Dabei ist noch zu betonen, dass Firefox anzeigt, dass die Übertragung nicht aufhört (erkennbar am Ladebalken).

              Nochmals hier mein Code:

              $data = utf8_encode($data);
               $filename="test20080219_054356";
               header('Content-type: application/force-download');
               header('Content-Disposition: attachment; filename="' . $filename. '"');
               header("pragma: no-cache");
               header("expires: 0");

              readfile($filename);

              Das ist alles.

              Vielleicht noch eine Erklärung für Doofe? Wäre super!

              1. Hallo,

                Nein. Ich simuliere eine Datenbanksystem und möchte die erzeugten Tabellen etc. in einem File speichern. Damit sich nicht die Anzeige ändert, habe ich AJAX benutzt.

                wenn Du auf einer ganz normalen statischen HTML-Seite einen Downloadlink hast, z.B. in der Form

                <a href="beispiel.exe">beispiel.exe</a>

                ändert sich dann die Anzeige? Nein. Nun willst Du, dass genau ein solcher Download einer dynamisch erzeugten "Datei" erfolgt. Warum jetzt Ajax? Warum?
                Wie Chris bereits schrieb, Javascript kann mit der zurückgesendeten Ressource wenig anfangen :-) Du willst ja nicht den Inhalt dieser Ressource ins aktuelle Dokument einflicken, Du willst diese Ressource abspeichern lassen. Überlass das doch der ganz normalen Browserfunktionalität, die schon  seit Urzeiten browserübergreifend vorhanden ist :-)

                Schau zunaechst nach, welche Header der Client erhaelt - bspw. mit der LiveHTTPHeaders-Exentsion fuer den Firefox oder mit FireBug.

                livehttpheaders-Extension

                Vielleicht noch eine Erklärung für Doofe? Wäre super!

                Verzichte auf Ajax, insbesondere dort, wo Du kein Ajax benötigst.

                Freundliche Grüße

                Vinzenz

  2. Hallo ingobar,

    direkten Zugriff (r/w/d) auf's lokale Dateisystem via Browser erhälst Du meines Wissens nach
    aktuell nur in der Kombination IE + ActiveX + Javascript. MS stellt dafür das FileSystemObject
    zur Verfügung. Wie Du es benutzen kannst, wird Dir in diesem how-to erklärt.

    Hoffe geholfen zu haben. Grüße, dicon