当前位置: 首页 > 知识库问答 >
问题:

Spring集成(SFTP):从子目录下载文件时出现问题

商夜洛
2023-03-14

我在Spring Boot应用程序中使用Spring集成版本5.4.4。我需要从“server_sftp”目录下的子目录中获取所有的XML文件。为此,我使用带有mget命令的SFTP流入站通道适配器和SFTP出站网关。不幸的是,应用程序只从根目录(server_sftp)下载文件,而不从子目录下载文件。

我哪里出错了?

@Bean
@InboundChannelAdapter(channel = "downloadXmlFileInputChannel", poller = @Poller(fixedDelay = "300000"))
public MessageSource<InputStream> sftpXmlFileMessageSource() {
    SftpStreamingMessageSource messageSource = new SftpStreamingMessageSource(template());
    messageSource.setRemoteDirectory("server_sftp/");
    return messageSource;
}

@Bean
public IntegrationFlow xmlFilesReadingFlow() {
    return IntegrationFlows
            .from(sftpXmlFileMessageSource(), e -> e.poller(Pollers.fixedDelay(Duration.ofSeconds(5))))
            .handle(Sftp
                    .outboundGateway(template(), Command.MGET, "'server_sftp/*'")
                    .options(Option.RECURSIVE)
                    .autoCreateLocalDirectory(true)
                    .localDirectoryExpression("'../webapps/event_report_app-1.0/xmlFilesLocalDirectory/' + #remoteDirectory")
                    .localFilenameExpression("#remoteFileName.replaceFirst('sftpSource', 'localTarget')"))
            .channel("downloadXmlFileOutputChannel")
            .get();
}

@Bean
public PollableChannel downloadXmlFileInputChannel() {
    return new QueueChannel();
}

@Bean
public DirectChannel downloadXmlFileOutputChannel() {
    return new DirectChannel();
}

sftp服务器上的目录结构

共有1个答案

哈涵容
2023-03-14

使用带有递归MGET命令的出站网关来获取完整的树。

使用mget命令mget基于模式检索多个远程文件,并支持以下选项:

-p:保留远程文件的时间戳。

-R:递归地检索整个目录树。

-x:如果没有文件与模式匹配,则抛出异常(否则,返回空列表)。

-D:成功传输后删除每个远程文件。如果忽略传输,则不会删除远程文件,因为FileExistsMode是IGNORE,而本地文件已经存在。

mget操作产生的消息负载是List对象(即,List of File对象,每个对象代表一个检索到的文件)。

 类似资料:
  • 我已经检查了SFTP服务器,它是启动的。

  • 我正在使用Spring集成流入站通道适配器,从远程SFTP获取流并解析内容进程的每一行。 我使用: 它现在可以工作了。但是我只能从目录中获取文件,但是我需要递归地从这个目录和子目录中获取文件,并解析每一行。 我注意到入站通道适配器是Sftp。内置适配器(sftpSessionFactory)。扫描仪(…) 。它可以扫描子目录。但我没有看到任何关于流式入站通道适配器的内容。 那么,如何在流入站通道适

  • 文件上载返回“状态代码8-无效参数”响应。想知道是什么导致了这种情况。 我使用Chilkat sFTP在多个合作伙伴之间传输和接收文件,没有问题,但是对于一个新的合作伙伴,我看到以下错误。合作伙伴的技术团队正在询问是否正在调用被动连接,但我在Chilkat中看不到任何可以让我改变这一点的属性。 日志消息:

  • 我在springboot项目1.5.10版中工作。释放 我正在为sftp使用Spring集成。以下gradle依赖项对我来说一切都很好 我还将普罗米修斯整合到模块中。 我已经完成了普罗米修斯的所有其他要求。但是我没有得到普罗米修斯的指标。 项目中的所有其他服务都在使用prometheus,但没有使用spring integration sftp,prometheus正在为所有这些服务工作。 我尝试

  • 我当前的项目是基于Spring集成的。我正在使用spring Boot开发这个项目。 我的目标是使用Spring Integr来完成以下任务。 > 连接到SFTP 检查是否在本地特定文件夹中创建了目录 检查特定于(CSV的文件的合格文件扩展名 将所有内容从SFTP远程目录下载到本地目录 逐行读取本地目录中的文件,并提取特定的列信息。 你能给我一些建议吗? 我怎样才能得到换乘开始时间?注意:我必须将

  • 我想把文件从远程服务器拉到我的本地服务器。我正在使用Spring Integration SFTP来拉文件。我有以下配置: 我不想在成功拉取后从remotedir中删除文件。这里发生的事情是每30秒,从remotedir的文件就会被拉到我的本地文件。我希望spring batch程序在第一次之后停止,不要再次拉出相同的文件。我怎样才能做到这一点?