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

使用Spring集成使用Spring Boot项目从SFTP服务器下载符合条件的文件

苏培
2023-03-14

我当前的项目是基于Spring集成的。我正在使用spring Boot开发这个项目。

我的目标是使用Spring Integr来完成以下任务。

>

  • 连接到SFTP

    检查是否在本地特定文件夹中创建了目录

    检查特定于(CSV的文件的合格文件扩展名

    将所有内容从SFTP远程目录下载到本地目录

    逐行读取本地目录中的文件,并提取特定的列信息。

    你能给我一些建议吗?

    我怎样才能得到换乘开始时间?注意:我必须将此需求开发为rest api。请提供一些指导,我如何使用spring集成来实现这一点?

    谢谢。:)

    public class SftpConfig {
    
        @Value("${sftp.host}")
        private String sftpHost;
    
        @Value("${sftp.port:22}")
        private int sftpPort;
    
        @Value("${sftp.user}")
        private String sftpUser;
    
        @Value("${sftp.password:#{null}}")
        private String sftpPasword;
    
        @Value("${sftp.remote.directory:/}")
        private String sftpRemoteDirectory;
    
        @Value("${sftp.privateKey:#{null}}")
        private Resource sftpPrivateKey;
    
        @Value("${sftp.privateKeyPassPhrase:}")
        private String privateKeyPassPhrase;
    
        @Value("${sftp.remote.directory.download.filter:*.*}")
        private String sftpRemoteDirectoryDownloadFilter;
    
        @Value("${sftp.remote.directory.download:/}")
        private String sftpRemoteDirectoryDownload;
    
        @Value("${sftp.local.directory.download:${java.io.tmpdir}/localDownload}")
        private String sftpLocalDirectoryDownload;
    
        /*
         * The SftpSessionFactory creates the sftp sessions. This is where you define
         * the host , user and key information for your sftp server.
         */
    
        // Creating session for Remote Destination SFTP server Folder
    
        @Bean
        public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory() {
            DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
            factory.setHost(sftpHost);
            factory.setPort(sftpPort);
            factory.setUser(sftpUser);
            if (sftpPrivateKey != null) {
                factory.setPrivateKey(sftpPrivateKey);
                factory.setPrivateKeyPassphrase(privateKeyPassPhrase);
            } else {
                factory.setPassword("sftpPassword");
            }
            factory.setAllowUnknownKeys(true);
            return new CachingSessionFactory<ChannelSftp.LsEntry>(factory);
        }
        
        /*
         * The SftpInboundFileSynchronizer uses the session factory that we defined above. 
         * Here we set information about the remote directory to fetch files from.
         * We could also set filters here to control which files get downloaded
         */
        
        @Bean
        public SftpInboundFileSynchronizer SftpInboundFileSynchronizer () {
            SftpInboundFileSynchronizer synchronizer = new SftpInboundFileSynchronizer();       
            return null;
            
        }
        
    
  • 共有1个答案

    殳勇
    2023-03-14

    如果查看SftpStreamingMessageSource:https://docs.spring.io/spring-integration/docs/current/reference/html/sftp.html#sftp-流式处理,再加上使用文件拆分器逐行读取该文件(也支持“first like as header”),您无需担心将文件传输到本地目录。您将按需使用远程内容完成所有操作。

    另一方面,由于您谈到REST API,您可能会有一些RestController或Spring集成HTTP入站网关:https://docs.spring.io/spring-integration/docs/current/reference/html/http.html#http-入站时,您需要考虑使用带有MGET命令的SftpOutboundGateway:https://docs.spring.io/spring-integration/docs/current/reference/html/sftp.html#sftp-出站网关。

    如果您仍然需要跟踪每个文件的下载时间,您需要考虑使用该网关两次:使用LIST命令和NAME_ONLY,第二次使用GET命令。此时,您可以为第二个网关的输入输出通道添加ChannelInterceptor,因此您将有一个文件名信息来关联和捕获此网关前后的开始和停止时间。

     类似资料:
    • 我有一个要求,我想使用spring集成,但不想使用spring boot从sftp服务器下载文件。我在这里使用jcraft库。希望使用spring集成库。

    • 问题内容: 我正在使用jsch从服务器下载文件,下面是我的代码。 com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2629) at com.jcraft.jsch.ChannelSftp._get(ChannelSftp.java:977) at com.jcraft.jsch.ChannelSftp.get(Channe

    • 我有spring批处理设置(远程分区),它从文件中读取项目并处理它们。 null 我指的是这个测试用例 https://github.com/spring-projects/spring-integration/blob/master/spring-integration-sftp/src/test/Java/org/springframework/integration/sftp/outboun

    • 我需要在SI中构建一个应用程序,它读取一个输入目录,该目录可能包含1000个文件,并将它们复制到远程服务器,例如10个服务器,处理器实例将在其中接收它们进行处理。文件的移动应该是循环方式,以便在处理它们时不会给任何服务器带来额外的负担。再详细一点——假设我们在输入目录中有10个文件,那么应用程序应该在服务器1上复制文件1,在服务器2上复制文件2......服务器10上的文件10。 顺序并不重要,重

    • 我正在使用JSCH从SFTP服务器下载文件。我使用单会话,多通道下载文件从不同文件夹位于SFTP。对于这个下载过程,我有一组排定的作业。每项工作将: 每次打开一个新通道()。通道名称:SFTP 使用方法获取要下载的文件总数的大小 如果size(Vector)大于零,则使用下载所有文件 最后关闭打开的通道。 在上面的过程中,大多数时候我得到的文件,找不到或没有这样的文件异常,并没有下载一些文件。 谁

    • 问题内容: 我想编写连接到我的大学SFTP服务器的脚本,并通过练习下载最新文件。到目前为止,我已经从Paramiko示例中更改了一些代码,但是我不知道如何下载最新文件。 这是我的代码: 问题答案: 使用而不是来获得具有属性(包括文件时间戳记)的列表。 然后,找到具有最大属性的文件条目。 代码如下: