使用 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
情況始終只查詢檔案(而不是目錄),因此我們可以安全地對 FtpMessageHandler
和 FtpOutboundGateway
元件使用 NLST
模式。
對於其他任何情況,可以擴充套件 FtpRemoteFileTemplate
以在覆蓋的 exist()
方法中實現自定義邏輯。
從版本 5.0 開始,新增了 RemoteFileOperations.invoke(OperationsCallback<F, T> action)
方法。此方法允許在同一個執行緒繫結的 Session
範圍內呼叫多個 RemoteFileOperations
。當您需要將 RemoteFileTemplate
的多個高階操作作為一個工作單元執行時,這非常有用。例如,AbstractRemoteFileOutboundGateway
在 mput
命令實現中使用了它,我們在提供的目錄中為每個檔案及其子目錄遞迴地執行 put
操作。更多資訊,請參閱 Javadoc。