You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Spring Integration SFTP覆盖本地文件?

解决Spring Integration SFTP客户端覆盖本地文件的问题

问题根源

默认情况下,Spring Integration SFTP的入站同步器使用AcceptOnceFileListFilter作为本地过滤器,它会缓存已处理过的文件名——只要本地存在对应文件,就会跳过后续的同步操作,哪怕远程服务器上的文件已经更新。

解决方案

要实现远程文件更新时覆盖本地文件,需要调整远程过滤器和本地过滤器的配置,让系统能识别远程文件的更新并触发重新下载:

方案1:基于文件修改时间跟踪更新(推荐)

使用SftpPersistentAcceptOnceFileListFilter作为远程过滤器,配合FileSystemPersistentAcceptOnceFileListFilter作为本地过滤器,两者通过MetadataStore持久化记录文件的状态(如远程文件的修改时间),当远程文件更新时,会自动触发覆盖本地文件。

示例Java配置:

@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer(SftpSessionFactory sftpSessionFactory) {
    SftpInboundFileSynchronizer synchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory);
    synchronizer.setRemoteDirectory("/your/remote/path");
    // 组合远程过滤器:先过滤.html文件,再跟踪文件修改状态
    synchronizer.setFilter(new CompositeFileListFilter<>(Arrays.asList(
            new SftpSimplePatternFileListFilter("*.html"),
            new SftpPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "sftp-remote-tracker-")
    )));
    return synchronizer;
}

@Bean
public SftpInboundFileSynchronizingMessageSource sftpMessageSource(SftpInboundFileSynchronizer synchronizer) {
    SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(synchronizer);
    source.setLocalDirectory(new File("sftp-inbound"));
    source.setAutoCreateLocalDirectory(true);
    // 本地过滤器:持久化跟踪本地文件状态,配合远程更新判断
    source.setLocalFilter(new FileSystemPersistentAcceptOnceFileListFilter(new SimpleMetadataStore(), "sftp-local-tracker-"));
    return source;
}

方案2:强制覆盖所有匹配文件

如果不需要检测远程文件是否更新,只是每次同步都强制覆盖本地已存在的.html文件,可以直接将本地过滤器设置为AcceptAllFileListFilter:

@Bean
public SftpInboundFileSynchronizingMessageSource sftpMessageSource(SftpInboundFileSynchronizer synchronizer) {
    SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(synchronizer);
    source.setLocalDirectory(new File("sftp-inbound"));
    source.setAutoCreateLocalDirectory(true);
    // 强制接受所有本地文件(即使已存在),实现覆盖
    source.setLocalFilter(new AcceptAllFileListFilter<>());
    return source;
}

补充说明

  • SftpPersistentAcceptOnceFileListFilter依赖SFTP服务器支持文件修改时间的获取,大部分主流SFTP服务器(如OpenSSH)都支持这一特性。
  • 如果需要更复杂的判断逻辑(比如基于文件大小、哈希值),可以自定义FileListFilter实现类,替换上述示例中的过滤器。

内容的提问来源于stack exchange,提问作者CraigW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 09:07:50