Как переместить файл из одной папки в другую на удаленном сервере sftp, предоставляя имя файла динамически с помощью Java Config? - PullRequest
0 голосов
/ 29 мая 2019

Я застрял с проблемой. У меня есть папка на моем сервере sftp с файлом в ней: folder / file.txt . Я просто пытаюсь переместить этот файл в другой каталог: folder / subfolder / file.txt . В документации было написано, что вам просто нужно использовать OutboundGateway с командой MV. Это нормально, но главная проблема в том, что я точно не знаю, как будет называться имя файла, поэтому мне нужно указать это имя динамически. Как я могу это сделать?

@Bean
@InboundChannelAdapter(value = "toSftpChannel",
        poller = @Poller(fixedDelay = "60000", maxMessagesPerPoll = "-1"))
public MessageSource<File> sftpMessageSource() {
    SftpInboundFileSynchronizingMessageSource source =
            new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
    source.setLocalDirectory(new File(localDirectory));
    source.setAutoCreateLocalDirectory(true);
    source.setLocalFilter(new AcceptOnceFileListFilter<File>());
    return source;
}

@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
    SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(getSftpSessionFactory());
    fileSynchronizer.setDeleteRemoteFiles(false);
    fileSynchronizer.setRemoteDirectory("/folder");
    fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.txt"));
    return fileSynchronizer;
}

@Bean
@ServiceActivator(inputChannel = "toSftpChannel")
public SftpOutboundGateway moveFileHandler() {
     SftpOutboundGateway sftpOutboundGateway = new SftpOutboundGateway(getSftpSessionFactory(), "mv", "'folder/" + "file.txt" + "'");                                                  
        sftpOutboundGateway.setRenameExpression(new LiteralExpression("/folder/subfolder/" + "file.txt"));
        return sftpOutboundGateway;
    }

1 Ответ

1 голос
/ 29 мая 2019

Вместо использования буквенных выражений используйте динамическое выражение.

Например, вместо

"'folder/" + "file.txt" + "'"

используйте

"'folder/' + headers['file_relativePath']"

и

sftpOutboundGateway.setRenameExpression(parser.parseExpression("'/folder/subfolder/' + headers['file_relativePath']";

(Относительный заголовок пути устанавливается входящим адаптером).

...