2010-06-18 35 views
16

在我的項目中,我有一個文件上傳功能。文件通過FTP上傳。我需要配置一個偵聽器,它只會在文件上傳完成時檢查新文件並調用腳本。因爲如果我在檢測到新文件後立即運行此腳本,它可以開始處理未完全上傳的文件,這將導致錯誤。任何人都可以告訴LINUX上這是否可行,我該怎麼做?LINUX:如何檢測到FTP文件上傳完成

+0

您能指定您想使用的語言嗎? – 2010-06-18 15:02:08

回答

12

我想嘗試使用inotify,事件代碼IN_CLOSE_WRITE。

+7

+1,但值得一提的是一些ftp服務器創建一個隱藏的臨時文件來接收數據,直到xfer完成。即'.foo-ftpupload-2837948723'在與目標文件相同的上傳路徑中,所以您需要確保您的事件循環可以處理該事件,並在該文件實際重命名之前不觸發任務。 – 2010-06-18 14:58:52

+0

@Tim Post好點。 vsftp例如不這樣做 – Pete 2010-06-18 15:03:05

+2

謝謝你的建議。我嘗試了inotify,但是我發現它在文件沒有完全上傳的情況下觸發IN_CLOSE_WRITE,但連接丟失(例如,如果我停止上傳或關閉FTP客戶端)。所以我相信沒有辦法檢測文件COMPLETELY上傳,而不是使用HTTP。它是否正確? – andr111 2010-06-19 07:24:17

3

看一看inotify

它不會自動腕錶子目錄雖然,所以如果你需要監視許多FTP帳戶(或FTP客戶端想要創建一個子目錄和上傳有),你會需要自己處理。

+0

正確。對於任何守護進程正在進行的監視,推薦使用廣度優先搜索(類似於'ftw()',但寬度優先),因此在開始時不會丟失子目錄。 – 2010-06-18 15:08:31

6

阿帕奇 「米娜」 FTP服務器(JAVA)也許能夠做你想做的,包括檢測上傳失敗,如前所述here

報價:

從Ftplet.afterCommand,你應該 能夠看到答覆。對於那些 失敗傳輸時該FTPServer的 可以檢測(會導致一個 SocketException或IOException的)這個 應該像426或551

Ftplet概述here,包括響應代碼。

的afterCommand方法簽名:

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

你會檢查reply.getCode()在您的覆蓋方法。您應該繼承DefaultFtplet而不是從零開始實現Ftplet接口。

請注意DefaultFtplet::afterCommand顯示如何檢測正在響應的客戶端命令。您可以檢查STORSTOU和回覆代碼426551以檢測上傳失敗。

但是,如果客戶端應用程序決定將傳輸視爲文件比它短,則這可能無法檢測到客戶端有意終止的上載。在無意中斷開連接的情況下,我認爲回覆代碼檢查將起作用。測試可能是殺死客戶端應用程序,或者關閉客戶端機器的網絡接口。

要處理成功上傳(您的原始問題),您可以查找成功答覆代碼,即226