Ftp_put auf dem Raspberry

Hallo;
Ich habe vorher unter windows die im „cams“-Verzeichnis gespeicherten Bilder der ImageGrabber-instanz auf meine FTP server hochgeladen


ftp_put($conn_id, $fern.$dateiname, $local."44586.jpg",FTP_BINARY);

Das funktioniert jetzt auch auf dem Raspberry, wenn ich in der ImageGrabber Instanz das Schreiben in den cache deaktiviere

wenn ich das jedoch (wie vorgesehen) aktiviert lasse und dafür mit IPS_GetMediaContent arbeite


$Inhalt = base64_decode(IPS_GetMediaContent(47837));
ftp_put($conn_id, $fern.$dateiname, $Inhalt, FTP_BINARY);

bekomme ich die Fehlermeldung: warning: ftp_put expects parameter 3 to be a valid path

leider finde ich den Befehl ftp_put im Handbuch nicht mehr??

was mache ich falsch?

lg bauli

Hallo
ftp_put ist ein PHP-Befehle . 3. Parameter sollte ein Pfad auf das lokale File.
Siehe hier:
http://php.net/manual/de/function.ftp-put.php

hmm — wenn das Bild im cache ist, hab ich aber keinen File und kein Verzeichnis… ?
Wie bringe ich das Bild dann als .jpg auf meinen ftp-Server?
Gibt es ein Möglichkeit, nur für diesen einen Fall da Bild zuerst ins Symcon „/cam“ Verzeichnis zu schreiben, ohne den cache.Modus zu deaktivieren?

lg Bauli

Was genau nichts bringt, weil damit machst du den Vorteil vom Cache zunichte. Weil du ja wieder eine Schreiboperation auf der SD Karte ausführst.
Was geht, habe ich aber kein Beispiel parat, ist das Bild direkt im RAM als Stream (resource) Objekt zu behalten und diesen MemoryStream kannst du wie eine Datei per PHP: ftp_fput - Manual übertragen.
Michael
Edit: Hier in der PHP Doku ist zu sehen wie so eine Resource aus einem String erstellt wird
http://php.net/manual/de/wrappers.data.php

hmm …
Mein raspi läuft mit SSD, die ist nicht so empfindlich. (Mein Windows Sytem ist 4 Jahre ohne Probleme auf SSD gelaufen)
Ausserdem tritt der Fall nur dann ein, wenn die Alarmanlage anspricht (hoffentlich nie), nur dann will ich die Bilder auf meinem ftp-Server sichern … ich denke das wäre schon vertretbar, zumal die ganze Messwertarchivierung wesentlich mehr Schreibvorgänge verursacht.

aber danke dür den Hinweis auf den Stream

lg
Bauli

Dann schalte einfach den Cache vom MediaObjekt aus.
Michael

Ja, das mich ich derzeit;

Nur wäre es totzdem interessant, wie man im Cache gespeicherte Mediafiles als file rausbringt und irgendwohin abspeichern kann.
Im Prinzip sollte ja die IPS.GetMediaContent - funktion das machen, nur fehlt mir dann dafür noch eine Beispiel, wie daraus ein file werden kann.

lg Bauli

Schau mal hier. Da kannst du ein wenig Tricken und eine virtuelle Datei erzeugen. :slight_smile:

php - Put a file on FTP site with contents from string variable (no local file) - Stack Overflow

paresy

Danke, dann werde ich mich wohl einmal damit befassen.
Das ist wohl auch das, was Michael schon angesprochen hat.

lg.Bauli

also, für alle die das auch interessiert, so funktioniert es:



$tmpFile = tmpfile();

$content = base64_decode(IPS_GetMediaContent(57837));
fwrite($tmpFile, $content);
rewind($tmpFile);
$tmpMetaData = stream_get_meta_data($tmpFile);

ftp_put($conn_id, $PfadDateifern,$tmpMetaData['uri'],FTP_BINARY);


(57837 ist bei mir die InstantID des Medienfiles der zugehörigen ImageGrabberInstanz)

danke an alle, die mitgeholfen haben

lg Bauli

Das entspricht aber nicht dem Verweis von paresy, mit

tmpfile()

Erstellt eine temporäre Datei mit einem eindeutigen Dateinamen im Lese-Schreib-Modus (w+) und gibt einen Dateizeiger zurück.

somit erzeugst du doch Dateien.

Der Trick ist doch gerade der „memory“-Teil

$tmpfile = fopen('php://memory', 'r+');
fputs($tmpfile, $content);
rewind($tmpfile); // or fseek

Und warum jetzt doch wieder eine Datei schreiben?
Paresys Tipp fand ich gut, habe es aber noch nicht getestet.
Sollte funktionieren:

$content = base64_decode(IPS_GetMediaContent(47837));
$stream= fopen('php://memory', 'r+');
fputs($stream, $content);
rewind($stream);
ftp_fput($conn_id, $PfadDateifern, $stream, FTP_BINARY);

Michael

weil das der ftp_put Befehl nicht als Parameter 3 akzeptiert
in meinem Beispiel hat erst der zusätzliche Befehl „stream_get_meta_data“ zum gewünschtem Ergebnis geführt

Ja, der Befehl für den Stream ist ja auch ftp_fput un d nicht ftp_put :slight_smile:
Hatte ich in Beitrag 4 noch selber verlinkt und eben falsch kopiert :slight_smile:
Michael

ahhhhhh …!!! … da hab ich drüber gelesen :banghead:

danke, jetzt funktionert das super!

lg bauli