使用Spring Integration通过FTP下载单个文件

时间:2017-05-26 05:31:01

标签: java spring ftp spring-integration

我正在阅读Spring Integration Documentation,认为文件下载实现起来非常简单。相反,这篇文章为我提供了许多不同的组件,似乎超出了我的需求:

  

FTP入站通道适配器是一个特殊的侦听器,它将连接到FTP服务器,并将侦听远程目录事件(例如,创建的新文件),此时它将启动文件传输。

     

流入站通道适配器生成带有InputStream类型有效负载的消息,允许在不写入本地文件系统的情况下获取文件。

我们说我的SessionFactory声明如下:

@Bean
public SessionFactory<FTPFile> ftpSessionFactory() {
    DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
    sf.setHost("localhost");
    sf.setPort(20);
    sf.setUsername("foo");
    sf.setPassword("foo");
    return new CachingSessionFactory<>(sf);
}

如何从这里开始下载给定网址上的单个文件?

3 个答案:

答案 0 :(得分:5)

您可以使用FtpRemoteFileTemplate ...

@SpringBootApplication
public class So44194256Application implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(So44194256Application.class, args);
    }

    @Bean
    public DefaultFtpSessionFactory ftpSessionFactory() {
        DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
        sf.setHost("10.0.0.3");
        sf.setUsername("ftptest");
        sf.setPassword("ftptest");
        return sf;
    }

    @Bean
    public FtpRemoteFileTemplate template(DefaultFtpSessionFactory sf) {
        return new FtpRemoteFileTemplate(sf);
    }

    @Autowired
    private FtpRemoteFileTemplate template;

    @Override
    public void run(String... args) throws Exception {
        template.get("foo/bar.txt",
                inputStream -> FileCopyUtils.copy(inputStream, 
                      new FileOutputStream(new File("/tmp/bar.txt"))));
    }

}

答案 1 :(得分:0)

以下代码块可能会有所帮助

@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true) {
        {
            setHost("localhost");
            setPort(20);
            setUser("foo");
            setPassword("foo");
            setAllowUnknownKeys(true);
        }
    };
    return new CachingSessionFactory<LsEntry>(factory);
}

@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
    SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory()) {
        {
            setDeleteRemoteFiles(true);
            setRemoteDirectory("/remote");
            setFilter(new SftpSimplePatternFileListFilter("*.txt"));
        }
    };
    return fileSynchronizer;
}

@Bean
@InboundChannelAdapter(channel = "sftpChannel", poller = @Poller(fixedDelay = "600"))
public MessageSource<File> sftpMessageSource() {
    SftpInboundFileSynchronizingMessageSource messageSource = new SftpInboundFileSynchronizingMessageSource(
            sftpInboundFileSynchronizer()) {
        {
            setLocalDirectory(new File("/temp"));
            setAutoCreateLocalDirectory(true);
            setLocalFilter(new AcceptOnceFileListFilter<File>());
        }
    };
    return messageSource;
}

https://github.com/edtoktay/spring-integraton

获得

答案 2 :(得分:0)

要添加到@garyrussell的答案中:

FTPS协议中,如果您位于防火墙后面,则可能会遇到 Host attempting data connection x.x.x.x is not the same as server y.y.y.y错误(如 here所述)。原因是默认情况下从DefaultFtpsSessionFactory返回的FtpSession实例会进行远程验证测试,即它以“活动”模式运行。

解决方案是在创建DefaultFtpsSessionFactory时通过设置“被动模式”来禁用FtpSession实例上的验证。

DefaultFtpsSessionFactory defaultFtpsSessionFactory() {

        DefaultFtpsSessionFactory defaultFtpSessionFactory = new DefaultFtpsSessionFactory(){
            @Override
            public FtpSession getSession() {
                FtpSession ftpSession = super.getSession();
                ftpSession.getClientInstance().setRemoteVerificationEnabled(false);
                return ftpSession;
            }
        };
        defaultFtpSessionFactory.setHost("host");
        defaultFtpSessionFactory.setPort(xx);
        defaultFtpSessionFactory.setUsername("username");
        defaultFtpSessionFactory.setPassword("password");
        defaultFtpSessionFactory.setFileType(2); //binary data transfer

        return defaultFtpSessionFactory;
    }