如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

使用 RemoteFileTemplate

从 Spring Integration 3.0 开始,为 FtpSession 对象提供了新的抽象。 该模板提供了发送、检索(作为 InputStream)、删除和重命名文件的方法。 此外,还提供了 execute 方法,允许调用者在会话中执行多个操作。 在所有情况下,模板都会负责可靠地关闭会话。 更多信息,请参见 RemoteFileTemplate 的 Javadoc。 还有一个 FTP 的子类:FtpRemoteFileTemplatespring-doc.cadn.net.cn

版本 4.1 添加了额外方法,包括 getClientInstance(),它提供对底层 FTPClient 的访问,从而让您能够使用低级 API。spring-doc.cadn.net.cn

并非所有 FTP 服务器都正确实现了 STAT <path> 命令。 某些服务器会对不存在的路径返回成功结果。 NLST 命令在路径为文件且存在时,能可靠地返回文件名。 然而,这无法支持检查空目录是否存在,因为当路径为目录时,NLST 始终返回空列表。 由于模板无法判断路径是否代表目录,因此在路径看似不存在时必须执行额外检查(使用 NLST 时)。 这会增加开销,需要向服务器发送多个请求。 从版本 4.1.9 开始,FtpRemoteFileTemplate 提供了 FtpRemoteFileTemplate.ExistsMode 属性,该属性包含以下选项:spring-doc.cadn.net.cn

  • STAT: 执行 STAT FTP 命令(FTPClient.getStatus(path))以检查路径是否存在。 这是默认行为,要求您的 FTP 服务器正确支持带有路径的 STAT 命令。spring-doc.cadn.net.cn

  • NLST: 执行 NLST FTP 命令 — FTPClient.listName(path)。 仅当测试路径为文件的完整路径时使用此选项。 该方式不适用于空目录。spring-doc.cadn.net.cn

  • NLST_AND_DIRS: 首先执行 NLST 命令,如果该命令未返回任何文件,则回退到一种临时切换工作目录的技术,使用 FTPClient.changeWorkingDirectory(path)。 有关更多信息,请参见 FtpSession.exists()spring-doc.cadn.net.cn

既然我们知道 FileExistsMode.FAIL 情况始终只查找文件(而非目录),我们可以安全地为 FtpMessageHandlerFtpOutboundGateway 组件使用 NLST 模式。spring-doc.cadn.net.cn

对于其他任何情况,FtpRemoteFileTemplate 可以被扩展以实现自定义逻辑,该逻辑在覆写的 exist() 方法中执行。spring-doc.cadn.net.cn

从 5.0 版本开始,提供了新的 RemoteFileOperations.invoke(OperationsCallback<F, T> action) 方法。 此方法允许在同一个线程绑定的 Session 作用域内调用多个 RemoteFileOperations 方法。 当您需要将 RemoteFileTemplate 的多个高层操作作为一个工作单元执行时,这非常有用。 例如,AbstractRemoteFileOutboundGateway 在使用 mput 命令实现时采用了该方法,其中对提供的目录中的每个文件执行 put 操作,并递归处理其子目录。 有关更多信息,请参阅 Javadocspring-doc.cadn.net.cn