• Hallo Besucher!

    Du bist neu im Forum? Dann registriere dich hier, um Diskussionen beizutreten oder eigene Themen zu erstellen. Für die Registrierung ist es erforderlich, dass du einen Spielaccount bei Die Stämme hast.

    Andernfalls kannst du dich hier direkt einloggen.

    Falls du dein Passwort vergessen hast, kannst du hier ein neues Passwort anfordern.

[Frage][PHP] Ereignisse des FTPs parsen

Vidirat

Gast
Moin liebe Mitscripter,

ich arbeite gerade an einem neuen Feature für meinen Uploaddienst Ratload. Es soll möglich sein, Dateien via FTP hoch zu laden, die dann automatisch von PHP die Datenbank eingelesen werden, in die auch alle anderen Dateien kommen, und in das richtige endgültige Verzeichnis verschoben werden. Dies soll vor allem für große Dateien zum Einsatz kommen. Nun meine Frage: Ist es möglich dieses FTP Ereignis, also die Fertigstellung eines Uploads, mit PHP zu parsen, oder muss ich auf andere Methoden ausweichen?

Cronjobs fallen weg. Es ist nicht, weil sie der Server nicht unterstützt, sondern, weil der Dienst wahrscheinlich nur ganz selten genutzt wird und sich der Cronjob, damit die Datei auch fast sofort verfügbar ist, mindestens alle 5min ausführen müsste. Das kostet deutlich zu viele Ressourcen, wenn man bedenkt, dass evtl. nur jede Woche mal eine Datei auf diese Weise hoch geladen wird (wenn überhaupt).

Falls sich jetzt Leute fragen, warum ich diesen Dienst dann haben will, hier meine Antwort: j4F. So wie die gesamte Seite auch. Es geht hierbei um Lehrzwecke, da ich diesen Skill evtl. mal später abgewandelt brauchen werde.

Andere Lösungen, die ich angedacht habe, waren z.B. die manuelle Ausführung des Scriptes. Jmd. der eine Datei hoch lädt, merkt sich den Dateinamen und ruft dann z.B. blablabl.php?f=name.zip auf. Diese Lösung ist aber weder smart noch praktisch. Auch habe ich überlegt, dass ich das mit C++ realisiere, aber auch da weiß ich noch nicht wie. Wenn jmd. eine Lösung mit ganz anderen Ansätzen hat, höre ich die natürlich auch gerne.

Danke im Voraus,
LG
Olli

P.S. Das ist ja mittlerweile schon obligatorisch: Ja, ich habe Google genutzt. Ich wusste allerdings auch gar nicht richtig, wonach ich suchen musste, habe aber dennoch einen angemessenen Teil Zeit damit verbracht.
 
Zuletzt bearbeitet:

DeletedUser

Gast
Grundsätzlich hast du ja drei Möglichkeiten (die mir eingefallen sind):
1. Der Uploader/User besucht nach dem Upload eine bestimmte PHP Seite. Die PHP Seite verschiebt alle FTP Uploads in das Verzeichnis, erstellt die Datenbankeinträge und zeigt die Links. Problem: Die Links zu den FTP Dateien sind öffentlich.
Lösungen:
Der Uploader bekommt einen eigenen temporären FTP Account, damit die Datei identifiziert werden kann.
Oder: Der Benutzer läd die Datei mit einem bestimmten Dateinamen hoch, der vorher auf der Website registriert wurde. Mit einem Passwort, dass man bei der Registrierung erhalten hat, holt man sich nach dem Upload den Link auf der Website.

2. Der FTP Server erkennt den Upload und führt ein Programm/Script (Bash,PHP,C++,....) aus. Welchen FTP Server benutzt du denn? Manche Server unterstützen solche "Events".

3. Cronjob. Das Script einmal pro Minute aufrufen und nach neuen Dateien im FTP Verzeichnis oder im Log vom FTP Server suchen. Das Problem ist dabei nicht der Ressourcenverbrauch, sondern wieder, dass man die Uploads nicht dem Uploader zuordnen kann und die Links wieder öffentlich sind.
 
Zuletzt bearbeitet von einem Moderator:

DeletedUser

Gast
Oder: Der Benutzer läd die Datei mit einem bestimmten Dateinamen hoch, der vorher auf der Website registriert wurde. Mit einem Passwort, dass man bei der Registrierung erhalten hat, holt man sich nach dem Upload den Link auf der Website.
Nunja, man könnte auch einfach für registrierte Benutzer ein eigenes Verzeichnis und dann dorthin die von dem jeweiligen Benutzer hochgeladenen Dateien reinschmeissen.
 

DeletedUser

Gast
Nunja, man könnte auch einfach für registrierte Benutzer ein eigenes Verzeichnis und dann dorthin die von dem jeweiligen Benutzer hochgeladenen Dateien reinschmeissen.
Möglich, dass es bei manchen Hostern so funktionieren kann. Aber die Dateien dürften nach dem Upload nicht sichtbar oder wenigstens nicht herunterladbar sein. Hatte den Gedanken auch, aber habe bei meinem Hoster (Plesk) keine Möglichkeit gefunden das zu realisieren.
 

DeletedUser

Gast
Wie wärs mit .htaccess? Oder man vergibt zufällig generierte Namen und trägt dann den Namen in der DB ein. Dadurch muss man dann nurnoch die Datensätze filtern und den entsprechenden Link (z.B. files.php?fid=1) verteilen oder eben im Klo versenken.
 

DeletedUser24674

Gast
So auf die schnelle fällt mir kein FTP-Server mit Hooks ein. (SVN hat das ja... *_*)
Du könntest aber einen Open-Source FTP-Server schnappen und in diesen selbst Hooks einbauen, sollte eigentlich nicht schwer sein! Zur Identifikation würde ich einfach pro Upload-User ein FTP-Konto einrichten und fertig.
 

Vidirat

Gast
Danke erst mal für die Antworten :D Eig. wollte ich ja gestern noch was dazu sagen, musste aber mein Windows neu installieren o_O

Der FTP- Server, den mein Hoster stellt, müsste der Standard- Apache- FTP- Server sein, da nichts anderes angegeben wurde. Das finde ich aber auch noch genauer raus. Geht das mit dem Shell Cmd "nmap"?

Nun denn... Wie ich ja schon sagte: Cronjobs sind mir nicht elegant genug^^ Die hätte ich auch ohne Hilfe setzen können. Dass die Dateien nicht sichtbar sind, wenn jmd. mit FTP darauf zugreift, sollte auch klappen. Kann man das nicht mit chmod machen? Bei 0000 könnte ja dann nicht mal der Eigentümer (also der FTP- Acc. für alle) seine Dateien lesen, oder?

Das mit den Hooks gucke ich mal nach. Jetzt weiß ich wenigstens wonach ich suchen kann/muss.

Ich habe btw. noch vor, eine Clientanwendung zu programmieren, mit der man direkt über das Kontextmenü unter "Senden an..." eine Datei an Ratload schicken kann. Daher sollte die Lösung theoretisch auch automatisiert ablaufen können.

e: Es könnte auch so realisiert werden, dass vor den Dateinamen die UID angegeben werden muss. Aus "hallo.txt" könnte z.B. "89-hallo.txt" werden. Damit wäre das Problem mit der Anonymität nicht mehr. Dateien ohne ID, werden ganz einfach gelöscht (Wo sollte sonst der Link hin geschickt werden?).
 
Zuletzt bearbeitet:

DeletedUser

Gast
Stimmt mit chmod sollte es gehen. ansonsten scheint es auch je nach ftp Server andere Möglichkeiten geben. Einfach mal nach ftp "upload only" googlen.

Naja, wenn dein FTP Server keine Events/Hooks bietet, und du partout keine Cronjobs benutzen willst, kannst du auch ein Bash/PHP/Python/C++/etc. Programm schreiben, dass immer läuft und das FTP Verzeichnis alle paar Sekunden auf neue Dateien überprüft.
 

DeletedUser24674

Gast
Wie ich ja schon sagte: Cronjobs sind mir nicht elegant genug^^

Je nach dem wie du dein Cronjob gestaltest kann er durchaus eine sehr elegante Lösung sein. Viele Resourcen werden aber aufjedenfall nicht verschleudert - selbst wenn der cron jede Minute ein Verzeichniss auf neue Dateien durchsucht...

Dass die Dateien nicht sichtbar sind, wenn jmd. mit FTP darauf zugreift, sollte auch klappen. Kann man das nicht mit chmod machen? Bei 0000 könnte ja dann nicht mal der Eigentümer (also der FTP- Acc. für alle) seine Dateien lesen, oder?

Siehe vorposter - Stichwort Upload-Only

Das mit den Hooks gucke ich mal nach. Jetzt weiß ich wenigstens wonach ich suchen kann/muss.

Ich glaube kaum, dass es einen fertigen FTP-Server mit Hooks gibt. Ich habe nur diesen für Windows gefunden. Wenn du allerdings vorhast eine Clientantwendung zu programmieren, kannst du ja einen ganz Simplen FTP-Server selbst coden der nur Uploads unterstützt oder einen bereits vorhandenen (Java FTPServer erweitern.

Ich habe btw. noch vor, eine Clientanwendung zu programmieren, mit der man direkt über das Kontextmenü unter "Senden an..." eine Datei an Ratload schicken kann. Daher sollte die Lösung theoretisch auch automatisiert ablaufen können.

e: Es könnte auch so realisiert werden, dass vor den Dateinamen die UID angegeben werden muss. Aus "hallo.txt" könnte z.B. "89-hallo.txt" werden. Damit wäre das Problem mit der Anonymität nicht mehr. Dateien ohne ID, werden ganz einfach gelöscht (Wo sollte sonst der Link hin geschickt werden?).

Dann könnte man aber für Fremde User Daten hochladen?
 

Vidirat

Gast
[...]Naja, wenn dein FTP Server keine Events/Hooks bietet, und du partout keine Cronjobs benutzen willst, kannst du auch ein Bash/PHP/Python/C++/etc. Programm schreiben, dass immer läuft und das FTP Verzeichnis alle paar Sekunden auf neue Dateien überprüft.

Das wäre ja letztlich sowas wie ein Cronjob^^ Aber gut... Wenn das wirklich weniger Ress braucht als ich dachte... Ich wollte halt etwas Smartes :cool:

[...]Wenn du allerdings vorhast eine Clientantwendung zu programmieren, kannst du ja einen ganz Simplen FTP-Server selbst coden der nur Uploads unterstützt oder einen bereits vorhandenen (Java FTPServer erweitern.

Das könnte ich in Erwägung ziehen^^

Dann könnte man aber für Fremde User Daten hochladen?

Hmmm... Im ersten Moment hatte ich das nicht für schlimm gehalten, aber du hast recht; wenn jmd. was Illegales hochlädt... Ein weiteres Proargument für einen eigenen FTP- Server.


Das mit dem "Upload only" bei FTP ist aber auch nochmal ein googlen wert.
 

DeletedUser

Gast
Das wäre ja letztlich sowas wie ein Cronjob^^ Aber gut... Wenn das wirklich weniger Ress braucht als ich dachte... Ich wollte halt etwas Smartes :cool:
Von der Rechenzeit kann es aber effizienter sein als ein Cronjob, und das war ja dein Problem :p Zum Beispiel mit einem C/C++ Programm, würde ich mal schätzen, wären das so ca. 200 Zeilen Code (ohne das tatsächliche Verarbeiten der Dateien, das kann ja ein Script übernehmen). Ich denke da könnte man sogar jede Sekunde das Verzeichnis überprüfen ohne dass i-eine Verschlechterung der Performance des Servers bemerkbar ist.
 

Vidirat

Gast
So. Ich habe mich jetzt entschieden, zwei Möglichkeiten zu nutzen.

1. Ich progge 'nen einfachen FTP Server, der über die gleichen Accs läuft, wie die bereits existierenden. Die Dateien werden nach dem Upload direkt in das richtige Verzeichnis verschoben. Dieser lässt sich dann aufgrund der Eingeschränktheit der Befehle wahrscheinlich nicht von allen FTP Clients nutzen.

2. Wenn das Obere nicht funktioniert, kann auch einfach der Standard FTP Server genutzt werden. In dem Fall muss dann aber noch ein PHP Script manuell aufgerufen werden, was bestätigt, dass man die Rechte hat. Dateien, die nicht verschoben wurden, werden täglich einmal gelöscht.

Zusätzlich werden alle Dateien mit den Rechten auf 0000 stehen. Der selbst gebaute FTP Server sendet grundsätzlich kein Verzeichnislisting.

Damit kann hier geclosed werden. Wer noch 'ne tolle Idee hat, kann sie ja per PN schicken. Ich freue mich drüber =)
 
Oben