martin11: Datei clientseitig speichern

Ich habe folgendes Problem:
Ich habe eine Datenbank programmiert, die interaktiv mit Usern kommuniziert (PHP / HTML) um deren Präferenzen bzgl. einer Wahl unterschiedlicher Kurse abzufragen. Das klappt seit mehreren Jahren. Anschließend werden die Teilnehmer nach bestimmten Kriterien auf die Kurse verteilt. Auch das klappt ebenso lange. Nun würde ich aber gerne die Abstimungsergebnisse samt einiger statistischer Daten dazu beispielsweise in mehreren csv-Datei abspeichern - das lassen meine beschränkten Server-Rechte aber so nicht zu.
Bisher half ich mir damit, dass ich am Ende der Wahl die Auswertung per PHP / HTML anzeigen ließ, die Ergebnisse per paste und copy dann bei mir in LibreOffice einfügte und das dann im Format meiner Wahl abspeicherte - auf Dauer wird mir das aber zu doof, selbst wenn es nur einmal im Jahr geschieht.
Prinzipiell hieß es in allen Foren, dass php dazu nicht taugt, weil es ja serverseitig arbeitet. Also müsste es mit Javascript (clientseitig) gehen. Doch ich finde keine Speicherfunktionen - ich bin absoluter Javascript-Neuling und habe - außer einer kurzen Eingabekontrolle - bisher auch so gut wie kein Javascript programmiert.

Konkret benötige ich also eine Javascript-Variante von folgendem php-geschreibsel:

$schreibe = fopen ($tabelle.".csv" , 'w');
fwrite ($schreibe, $ausgabetxt);
fclose();

oder dazu äquivalente andere Lösungen. In $ausgabetxt steht eine komplette csv-Datei als ein (sehr) langer String.

Danke schon jetzt!

  1. Hallo!

    Zunächst einmal zu deiner Idee. Du hast mit JavaScript keine Schreibrechte auf das Dateisystem. Lesen geht sehr eingeschränkt.

    Bisher half ich mir damit, dass ich am Ende der Wahl die Auswertung per PHP / HTML anzeigen ließ, die Ergebnisse per paste und copy dann bei mir in LibreOffice einfügte und das dann im Format meiner Wahl abspeicherte - auf Dauer wird mir das aber zu doof, selbst wenn es nur einmal im Jahr geschieht.
    Prinzipiell hieß es in allen Foren, dass php dazu nicht taugt, weil es ja serverseitig arbeitet.

    Warum soll PHP dazu nicht in der Lage sein? Du kannst dir mit PHP alle möglichen Daten ausliefern lassen. Z.B. Grafiken, XML, HTML und auch CSV. Erzeuge den/die passenden Header und liefere die Daten als vollständiges CSV-Dokument. Dabei kannst du auch den Dateinamen angeben und die Datei bequem speichern, verarbeiten oder was dir sonst so vorschwebt.

    Grüße, Matze

    1. Hallo!

      Zunächst einmal zu deiner Idee. Du hast mit JavaScript keine Schreibrechte auf das Dateisystem. Lesen geht sehr eingeschränkt.

      Das braucht es auch nicht. Content-Disposition lässt sich nämlich dennoch simulieren. Stichwort window.open oder download-Attribut auf einem a-Element und Data-URIs.

      Aber ich stimme dir voll und ganz zu, dass in diesem Fall eine Lösung mit PHP die elegantere Vorgehensweise ist.

      1. Hallo!

        Zunächst einmal zu deiner Idee. Du hast mit JavaScript keine Schreibrechte auf das Dateisystem. Lesen geht sehr eingeschränkt.

        Das braucht es auch nicht. Content-Disposition lässt sich nämlich dennoch simulieren. Stichwort window.open oder download-Attribut auf einem a-Element und Data-URIs.

        Das klingt interessant - allerdings fange ich mit keinem der Begriffe (Content-Disposition, a-Element, DATA-URI) etwas an.

    2. Hallo!

      Warum soll PHP dazu nicht in der Lage sein? Du kannst dir mit PHP alle möglichen Daten ausliefern lassen. Z.B. Grafiken, XML, HTML und auch CSV. Erzeuge den/die passenden Header und liefere die Daten als vollständiges CSV-Dokument. Dabei kannst du auch den Dateinamen angeben und die Datei bequem speichern, verarbeiten oder was dir sonst so vorschwebt.

      Grüße, Matze

      Danke für die Antwort. Ich habe den Code mit PHP geschrieben, lasse mir die CSV-Datei erstellen, will sie abspeichern - und dann geht nix mehr, weil ich ja SERVER-seitig die Rechte zum Speichern nicht habe. Ich habe mir zwischenzeitlich damit geholfen, dass ich mitten in einer html-Seite csv-Text erzeuge und diesen mittels copy und paste speichere - bequem geht aber anders. Ich werde aber dann bei den PHP-Leuten nochmals nachfragen. Falls dort eine Antwort kommt, stelle ich sie hier rein.

      1. Hallo!

        Danke für die Antwort. Ich habe den Code mit PHP geschrieben, lasse mir die CSV-Datei erstellen, will sie abspeichern - und dann geht nix mehr, weil ich ja SERVER-seitig die Rechte zum Speichern nicht habe. Ich habe mir zwischenzeitlich damit geholfen, dass ich mitten in einer html-Seite csv-Text erzeuge und diesen mittels copy und paste speichere - bequem geht aber anders.

        Ich vermute, dass bei dir der safe_mode aktiv ist und/oder PHP keine Schreibrechte für dein Verzeichnis hat weil es nicht den richtigen chmod hat. Leider erzählst du nicht ob und welche Fehlermeldung du bekommst und nein, "und dann geht nix mehr" ist keine ausreichende Problembeschreibung. Vielleicht lässt sich dein Problem schon lösen indem du PHP die benötigten Rechte für das Verzeichnis gibst. Also Stichwort chmod.
        Ein anderer Lösungsansatz wäre die Datei mit Hilfe der FTP-Funktionen von PHP zu speichern.

        Grüße, Matze

        1. Ich vermute, dass bei dir der safe_mode aktiv ist und/oder PHP keine Schreibrechte für dein Verzeichnis hat weil es nicht den richtigen chmod hat. Leider erzählst du nicht ob und welche Fehlermeldung du bekommst und nein, "und dann geht nix mehr" ist keine ausreichende Problembeschreibung. Vielleicht lässt sich dein Problem schon lösen indem du PHP die benötigten Rechte für das Verzeichnis gibst. Also Stichwort chmod.
          Ein anderer Lösungsansatz wäre die Datei mit Hilfe der FTP-Funktionen von PHP zu speichern.

          Grüße, Matze

          Hi,

          die Fehlermeldung ist Warning: %v%v() [function.%v]: failed to open stream: Permission denied in [hier kommt das Verzeichnis auf dem Server]/meinDateiname.php on line 39 (das ist die fopen-Zeile)

          danach kommen noch zwei Fehlermeldungen für die fwrite- und die fclose-Zeile, aber die sind dann ja logisch.
          Die Rechte werde ich voraussichtlich nicht bekommen, egal wie ich bettele, diesen Weg habe ich schon wegen ein paar anderer Probleme wiederholt versucht.

      2. Hallo!

        Danke für die Antwort. Ich habe den Code mit PHP geschrieben, lasse mir die CSV-Datei erstellen, will sie abspeichern - und dann geht nix mehr, weil ich ja SERVER-seitig die Rechte zum Speichern nicht habe.

        Aus deinem anderen post:

        Gibt es eine Möglichkeit, einen Button "Download" zu erzeugen, der mir die erzeugte Datei direkt auf MEINEN Rechner (also clientseitig) speichert oder sonst eine Möglichkeit, dieses Problem zu lösen?

        Ja wo willst du die Datei denn nun speichern?
        Wie du sie auf deinem Rechner speichern kannst, habe ich dir bereits geschrieben. Hast du den verlinkten Artikel gelesen und verstanden? Wenn nicht, woran bist du gescheitert?
        Wenn du die Datei auf deinem Rechner speichern willst, hat das allerdings wenig mit den Serverrechten zu tun.

        Grüße, Matze

        1. Hallo!

          Danke für die Antwort. Ich habe den Code mit PHP geschrieben, lasse mir die CSV-Datei erstellen, will sie abspeichern - und dann geht nix mehr, weil ich ja SERVER-seitig die Rechte zum Speichern nicht habe.

          Aus deinem anderen post:

          Gibt es eine Möglichkeit, einen Button "Download" zu erzeugen, der mir die erzeugte Datei direkt auf MEINEN Rechner (also clientseitig) speichert oder sonst eine Möglichkeit, dieses Problem zu lösen?

          Ja wo willst du die Datei denn nun speichern?
          Wie du sie auf deinem Rechner speichern kannst, habe ich dir bereits geschrieben. Hast du den verlinkten Artikel gelesen und verstanden? Wenn nicht, woran bist du gescheitert?
          Wenn du die Datei auf deinem Rechner speichern willst, hat das allerdings wenig mit den Serverrechten zu tun.

          Grüße, Matze

          Wie ich von Anfang an gesagt habe:
          Ich möchte die Datei bei mir speichern. Die csv-Datei habe ich, der Header war nicht das Problem. Auf dem Server speichern kann ich nicht (habe ich an anderer Stelle schon beantwortet, inclusive der Fehlermeldung, die genau das sagt), einen Pfad für meinen Rechner kann ich nicht angeben, da PHP das als Pfad auf dem Server interpretieren würde. Deswegen fragte ich ja auch nach einer Javascript-Lösung, weil - soweit ich das verstanden habe - PHP ja ausschließlich auf dem Server (geliehener Server von irgendeiner Firma, hat einer meiner Kollegen eingerichtet, der hat aber wohl noch VIEL mehr Ahnung als ich ...), die dazu nötigen Rechte habe und kriege ich aber wohl nicht.

          1. Die csv-Datei habe ich, der Header war nicht das Problem.

            Bzw., noch genauer: Der Inhalt der csv-Datei (samt Header usw.) steht in einer Variablen, als Datei habe ich sie aufgrund fehlender Berechtigung nicht.

            1. Hallo!

              Bzw., noch genauer: Der Inhalt der csv-Datei (samt Header usw.) steht in einer Variablen, als Datei habe ich sie aufgrund fehlender Berechtigung nicht.

              Welche Berechtigungen hast du denn eigentlich überhaupt? Kannst du die Variable nicht einfach ausgeben?

              Grüße, Matze

              1. Hallo!

                Bzw., noch genauer: Der Inhalt der csv-Datei (samt Header usw.) steht in einer Variablen, als Datei habe ich sie aufgrund fehlender Berechtigung nicht.

                Welche Berechtigungen hast du denn eigentlich überhaupt? Kannst du die Variable nicht einfach ausgeben?

                Grüße, Matze

                Wenn ich die Variable ausgeben will, wo dann bzw. wohin ausgeben? Mache ich es per echo $ausgabetxt, so fallen sämtliche Zeilenumbrüche weg. Bisher ließ ich mir stattdessen eine Html-Table erzeugen und die kopierte ich in ein Tabellenkalkulationsprogramm. DAS möchte ich in Zukunft irgendwie einfacher - mir wird aber immer klarer, dass das alles nur noch komplizierter wird, als die bisherige Methode.

                1. Hallo,

                  Wenn ich die Variable ausgeben will, wo dann bzw. wohin ausgeben? Mache ich es per echo $ausgabetxt, so fallen sämtliche Zeilenumbrüche weg. Bisher ließ ich mir stattdessen eine Html-Table erzeugen und die kopierte ich in ein Tabellenkalkulationsprogramm. DAS möchte ich in Zukunft irgendwie einfacher - mir wird aber immer klarer, dass das alles nur noch komplizierter wird, als die bisherige Methode.

                  Du musst als erstes Zeilenumbrüche mit "\n" in deine Variable einfügen. Und ja, mit echo $ausgabetxt die CSV-Datei ausgeben. Vorher musst du jedoch einen Header senden, damit der Browser das als CSV-Datei annimmt. Und: vorher natürlich keinerelei weitere Ausgaben.

                  vg ichbinich

                  --
                  Kleiner Tipp:
                  Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
                  1. Hi allerseits,

                    es dauerte etwas, bis ich wirklich verstanden hatte was wo wie gemeint war. Mein Hauptproblem bestand im Nachhinein betrachtet darin, dass ich in einer Schleife ALLE meine Datenbanktabellen hintereinander als je eine csv-Datei abzuspeichern versuchte. Zwischendrin stand einiger kommentierender echo-Ausgabetext. Beides mag der Header, den Matze (danke dafür) verlinkt hat, so nicht. Deswegen "tat" sich - trotz korrektem Header - erst einmal gar nichts. Erst bei genauerem Hinschauen merkte ich, dass die erste meiner csv-Dateien fehlte und nur die übrigen als für den Browser unlesbarer Käse ausgegeben wurden. Warum er mir zu diesem Zeitpunkt erst einmal keine csv-Datei zur Ausgabe anbot, kann ich inzwischen nicht mehr feststellen, irgendwo war wohl noch ein Haken drinnen.

                    JETZT klappt alles. Ich verlängere meine Variable $ausgabetxt einfach so lange, bis sie alle Tabellen enthält, habe alle per echo direkt kommentierenden Extras rausgestrichen und erhalte so eine ewig lange und äußerst unschöne, dafür aber sehr praktisch herunterladbare csv-Datei. Wenn ich Teile davon jemals wirklich wieder brauchen sollte, kann ich so den benötigten Teil rauskopieren und alles ist gut.

                    Es ist nicht völlig das was ich wollte, aber jedenfalls so viel näher an dem was ic wollte dran als alles was ich vorher hatte, dass ich mich vorerst einmal damit zufrieden gebe.

                    Danke allen Antwortenden und insbesondere Matze - auch wenn mir deine Antwort zuerst gar nicht half, war sie doch diejenige, die schließlich zum Ziel führte.

          2. Hallo,

            Ich möchte die Datei bei mir speichern. Die csv-Datei habe ich, der Header war nicht das Problem. Auf dem Server speichern kann ich nicht (habe ich an anderer Stelle schon beantwortet, inclusive der Fehlermeldung, die genau das sagt), einen Pfad für meinen Rechner kann ich nicht angeben, da PHP das als Pfad auf dem Server interpretieren würde.

            Um die Datei bei dir lokal zu speichern, mußt du weder eine Datei auf deinem Server erzeugen noch dort speichern.

            Du stellst mit PHP die CSV-Daten zusammen und lieferst diese dann mit dem entsprechenden Header als CSV aus und bekommst damit eine Datei als Download im Browser angeboten, die du dann an beliebiger Stelle auf deinem Rechner speichern kannst.

            Fertig. Wenn das bisher nicht geklappt hat, hast du doch ein Problem mit dem Header.

            vg ichbinich

            --
            Kleiner Tipp:
            Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
            1. Tach!

              Um die Datei bei dir lokal zu speichern, mußt du weder eine Datei auf deinem Server erzeugen noch dort speichern.
              Du stellst mit PHP die CSV-Daten zusammen und lieferst diese dann mit dem entsprechenden Header als CSV aus und bekommst damit eine Datei als Download im Browser angeboten, die du dann an beliebiger Stelle auf deinem Rechner speichern kannst.

              Sein Problem ist möglicherweise die Abfolge. Wenn PHP gerade dabei ist, mit einem HTML-Dokument auf einen Request zu antworten, kann es nicht gleichzeitig noch ein CSV-Dokument senden. Dazu braucht es einen neuen Request seitens des Browsers. Da auf dem Server keine Dateien geschrieben werden können, muss das Erzeugen des CSV-Inhalts erst beim zweiten Request erfolgen. Eventuell benötigte Daten müssen als Querystring (GET), POST-Parameter, Cookie oder über eine Session durchgereicht werden, sofern sie nicht aus einer Datenhaltung abgefragt werden können.

              Das Ablegen einer Datei auf dem Server, um sie in einem zweiten Schritt zu holen, wäre auch nicht besonders schön. Diese Datei muss am Ende wieder gelöscht werden. Das kann man zwar im zweiten Request machen, aber wenn der warum auch immer ausbleibt, bleibt eine Dateileiche liegen. Zudem kann es im Mehrnutzerbetrieb vorkommen, dass sich Vorgänge zweier Anwender für Anlegen und Löschen in die Quere kommen. Auch wenn das in der Praxis selten vorkommen mag, vermeidet man solche Situationen lieber von vornherein.

              dedlfix.

  2. Hallo,

    oder dazu äquivalente andere Lösungen.

    ...schreib Dir Deine Datei wie Du sie brauchst und biete sie Dir zum download an...
    oder schick Sie Dir per E-Mail...

    bis dann

    Ulli

    1. Hallo,

      ...schreib Dir Deine Datei wie Du sie brauchst und biete sie Dir zum download an...
      oder schick Sie Dir per E-Mail...

      Ulli

      Wow - und wie komme ich an dich ran?

      1. Ulli
        Wow - und wie komme ich an dich ran?

        O.K. DIE Frage war doof, gebe ich zu.

        1. Hallo,

          O.K. DIE Frage war doof, gebe ich zu.

          Macht nix! ;-)

          sag mal:
          Du kannst aber Deine PHP-Dateien auf den Server hochladen??
          Kannst Du da nicht eine Datei anlegen, die dann immer ueberschreibst?

          Ulli

  3. Hallo martin11,

    wenn eine IE-only-Lösung akzeptabel wäre: http://msdn.microsoft.com/en-us/library/windows/desktop/ms757034(v=vs.85).aspx

    Gruß, Jürgen