2010-06-18 6 views
16

Nel mio progetto ho una funzione di caricamento file. I file vengono caricati tramite FTP. Devo configurare un listener che controlli i nuovi file e invochi uno script solo al termine del caricamento dei file. Perché se eseguo questo script subito dopo aver rilevato il nuovo file, può iniziare a elaborare il file che non è stato completamente caricato, causando un errore. Qualcuno può dire se questo è possibile su LINUX e come posso farlo?LINUX: come rilevare che il caricamento del file ftp è terminato

+0

Puoi specificare la lingua che desideri utilizzare? –

risposta

12

Vorrei provare a utilizzare inotify, il codice evento IN_CLOSE_WRITE.

+7

+1, ma vale la pena ricordare che alcuni server ftp creano un file temporaneo nascosto per ricevere dati fino al termine del xfer. Cioè '.foo-ftpupload-2837948723' nello stesso percorso di upload del file di destinazione, quindi è necessario assicurarsi che il ciclo degli eventi possa gestirlo e non attivare l'attività finché il file non è stato effettivamente rinominato. –

+0

@Tim Post Buon punto. vsftp ad esempio non lo fa – Pete

+2

Grazie per i suggerimenti. Ho provato ad inotify, ma ho scoperto che spara IN_CLOSE_WRITE in situazioni quando il file non è completamente caricato, ma la connessione è persa (per esempio se smetto di caricare o chiudere il client FTP). Quindi credo che non ci sia modo di rilevare il file COMPLETAMENTE caricato piuttosto che usare HTTP. È corretto? – andr111

3

Dai un'occhiata alla inotify

Non guardare automaticamente gli indici secondari, però, quindi se avete bisogno di monitorare molti account FTP (o il client FTP vuole creare un sub dir e caricare lì) Avrete è necessario gestirlo da soli.

+0

corretto. Una ricerca in ampiezza (simile a 'ftw()', ma alla larghezza prima) è raccomandata per qualunque demone stia facendo la sorveglianza, quindi nessuna sottodirectory viene persa all'avvio. –

6

Apache "Mina" server ftp (java) potrebbe essere in grado di fare quello che vuoi, compreso il rilevamento di un Caricamento fallito, come detto here

Citazione:

Da Ftplet.afterCommand, si dovrebbe essere in grado di guardare la risposta. Per tali trasferimenti falliti che FTPServer in grado di rilevare (che provoca un SocketException o IOException) questo dovrebbe essere qualcosa come 426 o 551.

panoramica Ftplet here, compresi i codici di risposta.

La firma del metodo afterCommand:

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

Faresti controllare reply.getCode() nel metodo sovresposta. Dovresti creare una sottoclasse di DefaultFtplet invece di implementare l'interfaccia Ftplet da zero.

Si noti che DefaultFtplet::afterCommand mostra come rilevare a quale comando del client viene risposto. È possibile verificare STOR o STOU e il codice di risposta 426 o 551 per rilevare i caricamenti non riusciti.

Tuttavia, questo potrebbe non rilevare un caricamento intenzionalmente terminato dal client, se l'app client decide di trattare il trasferimento come se il file fosse solo più breve di quello che è. Nel caso di una connessione non intenzionalmente interrotta, penso che il controllo del codice di risposta funzionerà. Un test potrebbe essere quello di uccidere l'app del client o far cadere l'interfaccia di rete del client.

Per gestire i caricamenti riusciti (la domanda originale), è possibile cercare invece il codice di risposta positivo, ovvero 226.