FTP-Upload / serverseitig erkennen ob Upload vollständig ist
lulu
- programmiertechnik
0 Marc Reichelt
0 lulu0 Marc Reichelt
0 lulu
Huhu
ich habe eine Frage zu folgendem Problem.
Es wird per FTP automatisch eine Datendatei (csv) in ein Verzeichnis auf einen Webserver übertragen.
Dort wird diese von einem Skript (Perl, ist aber eigentlich egal) weiterverarbeitet.
Dieses Skript wird periodisch per Cron angestossen, guckt ob einen Datei
da ist und wenn ja "rattert" es los.
Soweit so einfach.
Da die Datendatei recht gross sein kann (3-4 MB) dauert die Übertragung schon eine gewisse Zeit.
Es muss jetzt natürlich sichergestellt werden, dass das Skript nicht anfängt mit der Datei zu arbeiten bevor diese komplett übertragen wurde.
Bisher hatte ich das durch eine ausreichend grosse Pause zwischen Datenübertragung und Weiterverarbeitung gelöst, das klappt aber nur wenn
der Datenexport tatsächlich zum vereinbartem Zeitpunkt stattfindet.
Da gibt es aber Abweichungen.
Wie würdet Ihr das lösen?
Meine bisherige Idee ist, dass ein weiteres Skript periodisch alle Dateien des upload-Verzeichnisses anguckt und die Dateigröße in einem Flatfile vermerkt.
Jetzt könnte man z.B. definieren, dass eine Datei als übertragen gilt wenn sich die Dateigröße bei den letzten 3 "Anguck"-Terminen nicht verändert hat.
Oder einfacher, man lässt das Datenverarbeitungs-Skript ein paar Sekunden "schlafen" und nur wenn sich in der Zeit an der Datei nichts geändert hat darf es anschliessend weiterarbeiten.
Bei einem Verbindungsabbruch hilft das natürlich nicht aber für einen "normalen" upload könnte das funktionieren.
Besser wäre eine Prüfsumme aber die gibt es hier leider nicht.
So richtig gut gefällt mir das Verfahren aber noch nicht und wäre daher für weitere Ideen, Tipps und Hinweise wie man es "richtig" macht dankbar.
Viele Grüße
lulu
Hallo lulu,
Besser wäre eine Prüfsumme aber die gibt es hier leider nicht.
Wieso?
Eine Lösung mittels Prüfsumme ist mir auch als erstes eingefallen:
1. Uploadprogramm ermittelt Prüfsumme und lädt diese auf den Server
2. Das Skript auf dem Server ermittelt in einer Schleife die Prüfsumme der hochzuladenden Datei, und wenn die Prüfsumme stimmt geht's los.
Das ist aber bestimmt keine ganz so schöne Lösung, da dort viele Ressourcen verbraten werden.
Ich würde es wahrscheinlich tatsächlich so lösen, dass ich eine Datei hochladen würde, in der die exakte Dateigröße drinsteht.
Das Skript gleicht dann diese Dateigröße mit der der hochgeladenen Datei ab, und voilà!
:-)
Grüße
Marc Reichelt || http://www.marcreichelt.de/
Huhu Marc
Besser wäre eine Prüfsumme aber die gibt es hier leider nicht.
Wieso?
Leider habe ich keinen Einfluss auf diesen FTP-Datenexport.
Da bin ich von den "Zulieferern" abhängig.
Ja, am einfachsten wäre es wenn die Datei unter dem Namen ihrer Prüfsumme hochgeladen würde.
Also z.B. den MD5-Hash als Dateinamen.
Das ist aber leider im Moment so nicht möglich
Viele Grüße
lulu
Hallo lulu,
Leider habe ich keinen Einfluss auf diesen FTP-Datenexport.
Da bin ich von den "Zulieferern" abhängig.
Ah ja - dann ist natürlich klar, dass du nicht bei jedem Client die Software zu deinen Gunsten verändern kannst.
Ja, am einfachsten wäre es wenn die Datei unter dem Namen ihrer Prüfsumme hochgeladen würde.
Also z.B. den MD5-Hash als Dateinamen.Das ist aber leider im Moment so nicht möglich
Hmm.
Dann würde ich einfach (wie du schon gesagt hast) etwa alle 10-15 Sekunden (testen?) überprüfen, ob sich die Dateigröße geändert hat - wenn nein ist die Datei fertig hochgeladen.
Grüße
Marc Reichelt || http://www.marcreichelt.de/
Huhu Marc
habe jetzt eine Lösung mit fstat() umgesetzt.
http://de.php.net/manual/de/function.fstat.php
Der Wert für 'mtime' wird beim Upload kontinuierlich aktualisiert, da
kann ich also den Zeitstempel direkt ablesen.
Damit kann ich einfach die Dateien auslassen die zu "frisch", also vermutlich noch "in der Mache" sind.
Viele Grüße
lulu