簡體   English   中英

LINUX:如何檢測ftp文件上傳完成

[英]LINUX: how to detect that ftp file upload is finished

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

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

Apache“Mina”ftp 服務器(java)可能能夠做你想做的事情,包括檢測失敗的上傳,正如這里提到的

引用:

從 Ftplet.afterCommand 中,您應該可以查看回復。 對於 FtpServer 可以檢測到的那些失敗的傳輸(導致 SocketException 或 IOException),這應該類似於 426 或 551。

此處為Ftplet 概述,包括響應代碼。

afterCommand 方法簽名:

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

你會在你的重寫方法中檢查reply.getCode() 您應該Ftplet DefaultFtplet而不是從頭開始實現Ftplet接口。

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

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

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

看看inotify

但是它不會自動監視子目錄,因此如果您需要監視許多 ftp 帳戶(或者 FTP 客戶端想要創建一個子目錄並上傳到那里),您需要自己處理。

我一直在尋找同樣的東西,偶然發現了具有上傳腳本功能的 pureftpd。 聽起來正是所需要的。 在這里找到詳細信息: http : //www.linuxbyexamples.net/2012/10/config-ftp-server-trigger-upload-file-to-call-external-script.html

我使用了 Proftpd 的 HiddenStores 功能。 它通過使用 .in.filename.ext 前綴來隱藏傳輸中的文件,直到它們完成上傳。 然后,您的進程可以安全地列出已完成文件的目錄。

http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html

一個舊的,但仍然值得添加好主意。

基本上,由於互聯網的性質,很難檢測到一個文件是您想要的整個文件。 這是我要做的:

讓客戶端執行上傳到暫存目錄,我們稱之為“上傳”,一旦放置(上傳)完成,客戶端應該重命名文件以將其放置在另一個目錄中,我們稱之為“准備好”。 如果客戶端在傳輸過程中遇到問題,文件將永遠不會出現在“就緒”目錄中。 所以沒有部分上傳。

客戶端應處理上傳錯誤並重試。 大多數客戶端會繼續上傳文件,而無需再次發送整個文件。

在服務器端,您只需要對“ready”目錄中的文件進行操作,並監視“upload”目錄中長期存在的文件。

為了額外保證,csender 可以生成一個校驗和文件,其中包含文件內容的 sha256 哈希值,並將其與文件一起發送。 這將允許您在對文件執行任何操作之前根據哈希驗證內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM