Startseite › Foren › Deutsches LiveCode-Forum › Lösung: Dateien aus einer App auf einen Server mittels PHP-Skript schreiben
Schlagwörter: php upload post
- Dieses Thema hat 2 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 3 Jahren, 5 Monaten von
Torsten.
-
AutorBeiträge
-
-
Oktober 16, 2021 um 12:09 Uhr #37808
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 -
Oktober 16, 2021 um 18:51 Uhr #37828
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?
-
Oktober 16, 2021 um 19:00 Uhr #37829
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#p197208local 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!
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.