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
Antwort
Ich würde versuchen, inotify, Ereigniscode IN_CLOSE_WRITE.
+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. –
@Tim Post Guter Punkt. vsftp zum Beispiel tut dies nicht – Pete
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
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.
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. –
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
.
Ich war auf der Suche nach dem gleichen und stieß auf pureftpd, die eine Upload-Skript-Funktion hat. Klingt nach genau was benötigt wurde. Gefunden die Details hier: http://www.linuxbyexamples.net/2012/10/config-ftp-server-trigger-upload-file-to-call-external-script.html
Busted Link .... – TheCarver
Ich habe die HiddenStores-Funktion von Proftpd verwendet. Es hält In-Transit-Dateien versteckt, indem sie ihnen ein .in.filename.ext voranstellt, bis sie das Hochladen beendet haben. Ihr Prozess kann dann die Verzeichnisse für abgeschlossene Dateien sicher auflisten.
http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html
- 1. So erkennen Sie, dass ein Marionettenlauf abgeschlossen ist
- 2. MQTT: Erkennen, ob die Übermittlung abgeschlossen ist
- 3. Ajax erkennen, wenn von Senden abgeschlossen ist
- 4. Wie kann ich erkennen, wenn der XAML-Slider abgeschlossen ist?
- 5. Wie zu erkennen, dass extern "C" ist in Wirkung
- 6. QNetworkAccessManager: Wie stelle ich sicher, dass der Download abgeschlossen ist?
- 7. Windows oder Linux erkennen?
- 8. Linux: erkennen zur Laufzeit, dass ein Prozess mehrere Threads haben
- 9. Erkennen, dass der Stapel voll ist
- 10. Wie kann ich Dateizugriffe in Linux erkennen?
- 11. Erkennen, dass Google Map im Vollbildmodus ist
- 12. Wie erkennen Sie ausstehende Systemabschaltung unter Linux?
- 13. Linux: Wie zu erkennen ist, ist USB-Tastatur eingesteckt und unplugged
- 14. startAnimatingWithImagesInRange ist nicht abgeschlossen
- 15. Wenn SendAsync abgeschlossen ist?
- 16. Wie erkennen Sie, dass ein TEvent eingerichtet wurde?
- 17. Wie überprüfen, wenn Javascript abgeschlossen ist
- 18. Wie erkennt man, wenn innerHTML abgeschlossen ist
- 19. Smart-gwt. Wie zu bestimmen, wann der Ladevorgang abgeschlossen ist
- 20. Wie testen, ob Java Future abgeschlossen ist?
- 21. Wie finden Sie, dass Flip-Animation iPhone abgeschlossen hat?
- 22. Wie MouseUp zu feuern, sobald mousemove abgeschlossen
- 23. Wie warten, bis Word-Objekt abgeschlossen ist?
- 24. Wie erhalten Sie Selen um zu erkennen, dass eine Seite geladen ist?
- 25. Wie zu erkennen, dass eine bestimmte App nicht über meinen Link installiert ist oder nicht
- 26. Wie zu erkennen ist, ist das Argument jQuery-Objekt
- 27. So erkennen Sie, dass der Browser auf Vollbildmodus gegangen ist
- 28. kann nicht erkennen, dass windows classic theme aktiv ist
- 29. warten, bis ein Jenkins Build abgeschlossen ist
- 30. Erkennen, dass ein PopupMenu auf API-Ebene 11 geschlossen ist
können Sie angeben, welche Sprache Sie verwenden möchten? –