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

coz*_*tel 3 java ftp spring 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);
}
Run Code Online (Sandbox Code Playgroud)

如何从此处下载给定URL上的单个文件?

Gar*_*ell 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"))));
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 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;
}
Run Code Online (Sandbox Code Playgroud)

从https://github.com/edtoktay/spring-integraton获取