Using RemoteFileTemplate
从 Spring Integration 3.0 开始,提供了 FtpSession`对象上的新抽象。该模板提供用于发送、检索(作为 `InputStream
)、移除和重命名文件的方法。此外,还提供了 execute`方法,允许调用方对会话执行多个操作。在所有情况下,模板负责可靠地关闭会话。有关更多信息,请参阅 Javadoc for `RemoteFileTemplate
。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)`方法。该方法使多个 `RemoteFileOperations`调用可在相同线程限定 `Session`的范围内调用。当您需要将 `RemoteFileTemplate`的多项高级操作作为一项工作单元执行时,这非常有用。例如,`AbstractRemoteFileOutboundGateway`将其用于 `mput`命令实现,在其中我们对提供的目录中的每个文件执行 `put`操作,并对其子目录递归执行。有关更多信息,请参阅 Javadoc。