Lösung: Dateien aus einer App auf einen Server mittels PHP-Skript schreiben

Startseite Foren Deutsches LiveCode-Forum Lösung: Dateien aus einer App auf einen Server mittels PHP-Skript schreiben

Schlagwörter: 

Ansicht von 2 Antwort-Themen
  • Autor
    Beiträge
    • #37808
      Torsten
      Teilnehmer

      Hi,

      wer eine mobile oder WebApp in Livecode baut, hat öfter das Bedürfnis, dass er Dateien auf seinem Server speichern möchte. Das ist aber gar nicht so einfach, da das elegante „put x into url y“ hier logischerweise nicht geht, denn sonst könnte ja jeder auf irgendwelchen Webservern die Dateien verändern 🙂

      Man braucht also eine Möglichkeit, die man sich selber bauen muss, um serverseitig Daten empfangen und abspeichern zu können. Das geht z.B. mit Livecode-Server sehr schön, allerdings haben die meisten Webhoster das nicht im Programm. Die einfachste Alternative ist daher PHP, welches fast überall vorinstalliert ist.

      Wir brauchen also eine Lösung, die auf der Livecode-Seite beschreibt, wie die Daten kodiert und übermittelt werden und auf der PHP-Seite, wie die Daten empfangen und abgespeichert werden.

      Ich habe jetzt mal einen einfachen Lösungsvorschlag, basierend auf der Anfrage von Mark Sailer:

      on post_binfile
         
         put "Der Dateiname" into tFile_Name
         put "Der Pfad zur Datei" into tFile_Path
         put "Kompletter Pfad zum PHP-Skript" into tUpload_Url
         
         put url ("binfile:" & tFile_Path) into tFile_Content
         put base64Encode(tFile_Content) into tFile_Content
         
         put urlencode(tFile_Content) into tFile_Content
         put urlencode(tFile_Name) into tFile_Name
         
         put "name=" & tFile_Name & "&" & "inhalt=" & tFile_Content into tArgList
         post tArgList to URL tUpload_Url
         
      end post_binfile

      Ich habe dazu ein sehr spartanisches PHP-Skript als Gegenstück dazu gebaut:
      savefile.php

      <?php
      
      // name = Dateiname
      // inhalt = Dateiinhalt
      
      $name = $_POST["name"];
      $inhalt = $_POST["inhalt"];
      $inhalt = base64_decode($inhalt); // Umwandlung in binäre Daten
      
      $handle = fopen ($name, "w");
      fwrite ($handle, $inhalt);
      fclose ($handle);
      
      ?>

      Der Witz ist, dass die Methode sehr einfach ist: die zu übertragende Datei wird immer als base64 kodiert, d.h. es kann ein Text oder auch ein Bild, PDF oder Executable sein.

      Sicherheitsproblem:

      * In der jetzigen Form kann natürlich jeder, der den Pfad zum PHP-Skript und die Keys kennt, Dateien abspeichern (z.B. auch andere PHP-Skripte, die ER dann geschrieben hat!)
      Hier ist ein Tipp gefragt, wie man das Hochladen von HTML mit eingebettetem PHP oder PHP-Dateien verhindern kann (in Livecode kann man das sehr einfach überprüfen mit „if tFile ends with „.php“, aber wie würde das in PHP gehen?

      * Um unberechtigten Zugriff zu verhindern, könnte man noch weitere POST-Parameter hinzufügen, über den sich zugelassene Clients identifizieren, z.B. $_POST[„user“] und $_POST[„password“]

      Erweiterung:

      * In der jetzigen Form werden die Dateien im Verzeichnis des PHP-Skripts abgelegt. Das ist nicht immmer sinnvoll. Hat jemand Code, der das verbessert?

      * Momentan wird davon ausgegangen, dass die Upload-Operation immer klappt. Um es rund zu machen, wäre noch Code auf beiden Seiten erforderlich, der reagiert, falls die Datei nicht geschrieben werden kann, es eine solche Datei bereits gibt (Überschreiben, anderer Name?) und wie Livecode dann damit weiter verfährt.

      Kommentare willkommen 🙂
      Torsten

    • #37828
      Torsten
      Teilnehmer

      Die Skripte funkltionieren auf dem Desktop und in der IDE ganz vorzüglich, aber in HTML5 scheint es nicht zu funktionieren, der POST-Befehl geht hier nicht korrekt ab, so dass das PHP-Skript keine Parameter übergeben bekommt, seltsam.

      Kennt das jemand und hat eine Lösung?

    • #37829
      Torsten
      Teilnehmer

      Ha, immer wieder dasselbe, man postet eine Frage, schaut sicherheitshalber nochmal nach und findet die Antwort selber 😉

      Hier hat der User MarBor ein Workaround per Javascript entwickelt:
      https://forums.livecode.com/viewtopic.php?f=120&t=34730&p=197208#p197208

      local tScript
         local someVariable
         
         put "hier die Argumentliste für POST einfügen" into someVariable
         
         put "var xhr = new XMLHttpRequest();" & cr & \
               "xhr.open(" & quote & "POST" & quote & \
               ", " & quote & "Hier die URL des PHP-Skripts einfügen" & quote & ", true);" & cr & \
               "xhr.setRequestHeader(" & quote & "Content-Type" & quote & \
               ", " & quote & "application/x-www-form-urlencoded; charset=UTF-8" & quote & ");" & cr & \
               "xhr.send('" & someVariable & "');" into tScript
         
         do tScript as "JavaScript"

      Getestet und funktioniert!

Ansicht von 2 Antwort-Themen
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.