跳到主要内容
版本:7.0.2

使用 RemoteFileTemplate

DeepSeek V3 中英对照 Using RemoteFileTemplate Using RemoteFileTemplate

自 Spring Integration 3.0 起,针对 FtpSession 对象提供了一种新的抽象。该模板提供了发送、检索(作为 InputStream)、删除和重命名文件的方法。此外,还提供了一个 execute 方法,允许调用者在会话上执行多个操作。在所有情况下,模板都会确保可靠地关闭会话。更多信息,请参阅 RemoteFileTemplate 的 Javadoc。针对 FTP 有一个子类:FtpRemoteFileTemplate

版本 4.1 新增了额外的方法,包括 getClientInstance(),该方法提供对底层 FTPClient 的访问权限,从而使您能够使用底层 API。

并非所有 FTP 服务器都能正确实现 STAT <路径> 命令。有些服务器会对不存在的路径返回肯定结果。当路径是文件且存在时,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 的多个高级操作作为一个工作单元执行时,这非常有用。例如,AbstractRemoteFileOutboundGatewaymput 命令实现中使用了该方法,其中我们对指定目录中的每个文件及其子目录递归执行 put 操作。更多信息请参阅 Javadoc

从版本 6.5 开始,AbstractRemoteFileOutboundGateway 支持通过 SpEL 表达式在运行时动态解析 FileExistsMode。这允许您根据消息内容或其他条件,决定当文件已存在时要采取的操作。

要使用此功能,请在网关上配置 fileExistsModeExpression 属性。该表达式的求值结果可以是:

  • 一个 FileExistsMode 枚举值(例如,FileExistsMode.REPLACE

  • 一个表示 FileExistsMode 的字符串(不区分大小写,例如,"REPLACE"、"append")

如果表达式返回 null,将使用网关配置的默认 fileExistsMode

更多信息请参阅 Javadoc

important

当使用 FileExistsMode.APPEND 模式时,临时文件名功能将自动禁用,无论 useTemporaryFileName 设置如何。这是因为先追加内容到临时文件再重命名它,无法实现预期的 append 行为。