使用 RemoteFileTemplate

從 Spring Integration 3.0 開始,在 FtpSession 物件之上提供了一個新的抽象。該模板提供了傳送、檢索(作為 InputStream)、刪除和重新命名檔案的方法。此外,還提供了一個 execute 方法,允許呼叫者在會話上執行多個操作。在所有情況下,模板都會負責可靠地關閉會話。更多資訊,請參閱 RemoteFileTemplate 的 Javadoc。FTP 有一個子類:FtpRemoteFileTemplate

版本 4.1 添加了其他方法,包括 getClientInstance(),它提供了對底層 FTPClient 的訪問,從而使您能夠訪問低階 API。

並非所有 FTP 伺服器都正確實現了 STAT <path> 命令。有些伺服器對不存在的路徑返回肯定結果。當路徑是檔案且存在時,NLST 命令可以可靠地返回名稱。但是,它不支援檢查空目錄是否存在,因為當路徑是目錄時,NLST 總是返回一個空列表。由於模板不知道路徑是否表示目錄,因此當路徑似乎不存在時(使用 NLST 時),它必須執行額外的檢查。這會增加開銷,需要向伺服器傳送多個請求。從版本 4.1.9 開始,FtpRemoteFileTemplate 提供了 FtpRemoteFileTemplate.ExistsMode 屬性,該屬性具有以下選項

  • STAT: 執行 STAT FTP 命令 (FTPClient.getStatus(path)) 來檢查路徑是否存在。這是預設選項,要求您的 FTP 伺服器正確支援 STAT 命令(帶路徑)。

  • NLST: 執行 NLST FTP 命令 — FTPClient.listName(path)。如果您正在測試檔案的完整路徑,請使用此選項。它不適用於空目錄。

  • NLST_AND_DIRS: 首先執行 NLST 命令,如果它沒有返回檔案,則回退到一種透過使用 FTPClient.changeWorkingDirectory(path) 臨時切換工作目錄的技術。更多資訊,請參閱 FtpSession.exists()

由於我們知道 FileExistsMode.FAIL 情況始終只查詢檔案(而不是目錄),因此我們可以安全地對 FtpMessageHandlerFtpOutboundGateway 元件使用 NLST 模式。

對於其他任何情況,可以擴充套件 FtpRemoteFileTemplate 以在覆蓋的 exist() 方法中實現自定義邏輯。

從版本 5.0 開始,新增了 RemoteFileOperations.invoke(OperationsCallback<F, T> action) 方法。此方法允許在同一個執行緒繫結的 Session 範圍內呼叫多個 RemoteFileOperations。當您需要將 RemoteFileTemplate 的多個高階操作作為一個工作單元執行時,這非常有用。例如,AbstractRemoteFileOutboundGatewaymput 命令實現中使用了它,我們在提供的目錄中為每個檔案及其子目錄遞迴地執行 put 操作。更多資訊,請參閱 Javadoc