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

Я застрял с проблемой. У меня есть папка на моем sftp-сервере с файлом: папка/файл.txt. Я пытаюсь просто переместить этот файл в другой каталог: папка/подпапка/файл.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;
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

например вместо

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

использовать

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

а также

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

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

большое спасибо! На самом деле это работает, но теперь он удаляет другие файлы в подпапке, хотя я установил в синхронизаторе файлов setDeleteRemoteFiles значение false, я делаю что-то неправильно?

Alexei Stirbul 30.05.2019 16:26

Извините, не совсем понятно, что вы подразумеваете под "другими файлами". Пожалуйста, добавьте больше деталей.

Gary Russell 30.05.2019 16:58

извините за беспокойство, я исправил эту проблему - проблема была в том, что строка setDeleteRemoteFiles была закомментирована) Спасибо за помощь!!! Это высоко ценится!

Alexei Stirbul 30.05.2019 17:14

Другие вопросы по теме