2010-06-18 13 views
16

In meinem Projekt habe ich eine Datei-Upload-Funktion. Dateien werden per FTP hochgeladen. Ich muss einen Listener konfigurieren, der nur nach dem Hochladen von Dateien nach neuen Dateien sucht und ein Skript aufruft. Wenn ich dieses Skript sofort nach dem Erkennen der neuen Datei ausführe, kann es damit beginnen, Dateien zu verarbeiten, die nicht vollständig hochgeladen wurden. Dies führt zu einem Fehler. Kann jemand sagen, ob dies auf LINUX möglich ist und wie kann ich das machen?LINUX: wie zu erkennen, dass FTP-Datei-Upload abgeschlossen ist

+0

können Sie angeben, welche Sprache Sie verwenden möchten? –

Antwort

12

Ich würde versuchen, inotify, Ereigniscode IN_CLOSE_WRITE.

+7

+1, aber es ist erwähnenswert, dass einige FTP-Server eine versteckte temporäre Datei erstellen, um Daten zu empfangen, bis der Xfer fertig ist. I.e. '.foo-ftpupload-2837948723' im selben Upload-Pfad wie die Zieldatei, so müssen Sie sicherstellen, dass Ihre Ereignisschleife damit umgehen kann und die Aufgabe erst auslösen, wenn die Datei tatsächlich umbenannt wurde. –

+0

@Tim Post Guter Punkt. vsftp zum Beispiel tut dies nicht – Pete

+2

Vielen Dank für Anregungen. Ich habe inotify versucht, aber ich habe festgestellt, dass IN_CLOSE_WRITE ausgelöst wird, wenn die Datei nicht vollständig hochgeladen wurde, aber die Verbindung unterbrochen wurde (zum Beispiel wenn ich den Upload oder das Schließen des FTP-Clients einstellte). Daher glaube ich, dass es keine Möglichkeit gibt, die Datei VOLLSTÄNDIG zu laden, anstatt HTTP zu verwenden. Ist das richtig? – andr111

3

Werfen Sie einen Blick auf inotify

Es Unterverzeichnisse nicht automatisch obwohl sehen, wenn Sie also viele FTP-Accounts (oder der FTP-Client will ein Unterverzeichnis erstellen und laden dort) überwachen müssen Sie werde müssen Sie selbst damit umgehen.

+0

Korrigieren. Eine Breiten-zuerst-Suche (ähnlich wie ftw() ', aber breast-first) wird für jeden Daemon empfohlen, der beobachtet, so dass keine Unterverzeichnisse beim Start übersehen werden. –

6

Apache "Mina" ftp-Server (Java) könnte in der Lage sein zu tun, was Sie wollen, ein ausgefallenes Upload einschließlich Erfassung, wie here erwähnt

Zitat:

Von Ftplet.afterCommand, sollten Sie in der Lage sein, die Antwort zu sehen. diese gescheitert Transfers für die ftpserver erkennen kann (die eine Socket oder IOException verursacht) diese sollte so etwas wie 426 oder 551.

Ftplet Übersicht here, einschließlich Antwortcodes sein.

Die afterCommand Methodensignatur:

FtpletResult afterCommand(FtpSession session, FtpRequest request, FtpReply reply) 

Sie würden reply.getCode() in Ihre überschriebene Methode überprüfen. Sie sollten die Unterklasse DefaultFtplet statt Ftplet Schnittstelle von Grund auf neu implementieren.

Beachten Sie, dass DefaultFtplet::afterCommand zeigt, wie erkannt wird, auf welchen Clientbefehl reagiert wird. Sie können nach STOR oder STOU und den Antwortcode 426 oder 551 nach fehlgeschlagenen Uploads suchen.

Ein Upload, der absichtlich vom Client beendet wird, wird jedoch möglicherweise nicht erkannt, wenn die Clientanwendung beschließt, die Übertragung so zu behandeln, als wäre die Datei kürzer als sie ist. Im Falle einer unbeabsichtigt unterbrochenen Verbindung glaube ich, dass die Antwortcode-Überprüfung funktioniert. Ein Test könnte darin bestehen, die Client-App zu beenden oder die Netzwerkschnittstelle des Client-Rechners herunterzufahren.

Um erfolgreiche Uploads (Ihre ursprüngliche Frage) zu behandeln, können Sie stattdessen nach dem Erfolg reply-code suchen, zB 226.

Verwandte Themen