用RemoteFileTemplate
从 Spring Integration 3.0 开始,在FtpSession
对象。
该模板提供了用于发送、检索(作为InputStream
)、删除和重命名文件。
此外,一个execute
方法允许调用方对 session 执行多个作。
在所有情况下,模板都会可靠地关闭会话。
有关更多信息,请参阅Javadoc 的RemoteFileTemplate
.
FTP 有一个子类:FtpRemoteFileTemplate
.
版本 4.1 添加了其他方法,包括getClientInstance()
,它提供对底层FTPClient
因此,您可以访问低级 API。
并非所有 FTP 服务器都能正确实现STAT <path>
命令。
有些 API 会为不存在的路径返回 positive 结果。
这NLST
command 可靠地返回路径为文件且存在的名称。
但是,这不支持检查是否存在空目录,因为NLST
当 path 是 directory 时,始终返回空列表。
由于模板不知道路径是否代表目录,因此当路径似乎不存在时,它必须执行额外的检查(当使用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
case 始终只查找文件(而不是目录),我们安全地使用NLST
mode 的FtpMessageHandler
和FtpOutboundGateway
组件。
对于任何其他情况,FtpRemoteFileTemplate
可以扩展以在覆盖的exist()
方法。
从版本 5.0 开始,新的RemoteFileOperations.invoke(OperationsCallback<F, T> action)
方法可用。
此方法允许多个RemoteFileOperations
调用在相同的线程绑定Session
.
当您需要执行RemoteFileTemplate
作为一个工作单元。
例如AbstractRemoteFileOutboundGateway
将其与mput
command 实现,其中我们执行put
作,并递归地作其子目录。
有关更多信息,请参阅 Javadoc。