使用 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。