Я застрял с проблемой. У меня есть папка на моем 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;
}
Вместо буквенных выражений используйте динамическое выражение.
например вместо
"'folder/" + "file.txt" + "'"
использовать
"'folder/' + headers['file_relativePath']"
а также
sftpOutboundGateway.setRenameExpression(parser.parseExpression("'/folder/subfolder/' + headers['file_relativePath']";
(Заголовок относительного пути устанавливается входящим адаптером).
Извините, не совсем понятно, что вы подразумеваете под "другими файлами". Пожалуйста, добавьте больше деталей.
извините за беспокойство, я исправил эту проблему - проблема была в том, что строка setDeleteRemoteFiles была закомментирована) Спасибо за помощь!!! Это высоко ценится!
большое спасибо! На самом деле это работает, но теперь он удаляет другие файлы в подпапке, хотя я установил в синхронизаторе файлов setDeleteRemoteFiles значение false, я делаю что-то неправильно?