2012-05-11 69 views
0

我有一個通過FTP處理傳入文件的服務。APPE FTP命令傳輸完成檢測serverside

在安裝了Proftpd的Debian服務器上,我使用iNotify事件來確定文件傳輸何時完成,我可以開始使用它。

一旦文件不再寫入,就會觸發事件。

這很好,直到我發現新的尼康D4相機和WT-5無線發射器使用APPE FTP命令發送文件。

從我看過的內容看來,APPE FTP命令發送數據塊中的文件,這些文件在第一個塊創建文件後附加到服務器上的現有文件中。

但是,這會導致幾個iNotify事件被觸發,因爲該文件會在連接關閉之前幾次而不是一次。

由於文件在文件完成之前處理,它們將在處理完成後導致錯誤。而且我總是在處理後刪除文件。

由於我的這項服務必須保持快速處理傳入文件,我真的很喜歡iNotify這個解決方案,並且如果文件大小在n秒內保持不變,或者無論如何確定文件傳輸做完了。

我的問題是:有什麼辦法來確定文件傳輸是否實際完成,而不必檢查文件大小或比較最後修改日期?

我試圖找到一種方法來做到這一點在proftpd沒有用。

的xferlog中指出,同一個文件完成了幾次:

Fri May 11 14:15:41 2012 2 host-95-199-17-243.mobileonline.telia.com 131072 /var/app/incoming/file.JPG b _ i r auser ftp 0 * c 
Fri May 11 14:15:43 2012 2 host-95-199-17-243.mobileonline.telia.com 262144 /var/app/incoming/file.JPG b _ i r auser ftp 0 * c 
Fri May 11 14:15:47 2012 3 host-95-199-17-243.mobileonline.telia.com 385624 /var/app/incoming/file.JPG b _ i r auser ftp 0 * c 

末的C意味着轉移完成。

因此,如果我必須檢查文件是否實際上完成每個傳入的文件,這將意味着實際完成的文件不必要的延遲。

似乎這不應該是一個不尋常的問題,但無法找到任何有關它。

任何想法?

+0

哪個事件你在聽在inotify的? – CagedMantis

+0

我正在收聽IN_CLOSE_WRITE。 – JayLev

回答

0

不幸的是,這種用例沒有好的答案。問題是,只有FTP客戶端知道它何時完成向服務器上傳數據,並且它是知道什麼時候完成「文件」的FTP客戶端。該協議按照字節流進行操作。而且,正如您在APPE命令中注意到的那樣,除了只有一次上載外,上傳可能會發生在區塊中。請注意,當FTP客戶端使用REST命令時,可能會發生相同的行爲,然後是STOR。 (SFTP,爲了比較,只允許上傳由組塊,即它使用:OPENWRITEWRITEWRITE,...,CLOSE,更加緊密地映射到用於寫文件的UNIX系統調用)。

你甚至可能會嘗試使用QUIT命令作爲觸發,要知道客戶端已經完成了所有的塊的上傳到您的服務器。假設您的FTP客戶端一次只打開一個FTP會話,這可能會起作用。

根據您的具體使用情況/需求,有可能找出其他解決方案;如果你願意,隨時給我發電子郵件。

希望這會有所幫助!

0

得還應對檢測JPG轉移的結束,並使用這些解決方案絞車可以集成在腳本:

Catching error: Corrupt JPEG data: premature end of data segment

一個簡單的方法來檢查,如果JPEG數據是否完整與否是分別檢查FF D8和FF D9的第一個和最後兩個字節。這兩個字節分別標識JPEG文件的開始和結束。

或者使用ImageMagick http://www.imagemagick.org/discourse-server/viewtopic.php?f=3&t=8483

希望,這可能與D5幫助;) 馬蒂厄