跳到主要内容

使用 RemoteFileTemplate

QWen Plus 中英对照 Using RemoteFileTemplate Using 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 的高级操作作为一项工作单元执行时非常有用。例如,AbstractRemoteFileOutboundGateway 在实现 mput 命令时使用它,我们对提供的目录中的每个文件以及其子目录递归地执行 put 操作。更多信息请参阅 Javadoc