使用 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:执行STATFTP 命令(FTPClient.getStatus(path))以检查路径是否存在。 这是默认设置,要求您的 FTP 服务器正确支持STAT命令(带路径)。 -
NLST:执行NLSTFTP 命令 —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) 方法。
此方法允许在同一个线程绑定的 Session 范围内调用多个 RemoteFileOperations 调用。
当您需要将 RemoteFileTemplate 的多个高级操作作为一项工作单元执行时,这非常有用。
例如,AbstractRemoteFileOutboundGateway 将其用于 mput 命令实现,在该实现中,我们对提供的目录中的每个文件及其子目录递归执行 put 操作。
有关更多信息,请参阅 Javadoc。
从版本 6.5 开始,AbstractRemoteFileOutboundGateway 支持通过 SpEL 表达式在运行时动态解析 FileExistsMode。
这允许您根据消息内容或其他条件确定文件已存在时要执行的操作。
要使用此功能,请在网关上配置 fileExistsModeExpression 属性。
表达式可以评估为:
-
FileExistsMode枚举值(例如,FileExistsMode.REPLACE) -
FileExistsMode的字符串表示(不区分大小写,例如,“REPLACE”,“append”)
如果表达式返回 null,将使用在网关上配置的默认 fileExistsMode。
有关更多信息,请参阅 Javadoc。
当使用 FileExistsMode.APPEND 时,无论 useTemporaryFileName 设置如何,临时文件名功能都会自动禁用。
这是因为追加到临时文件然后重命名它将无法实现预期的追加行为。