Spring SFTP - Загрузить файл с другим именем

Я использую Spring для загрузки файла на удаленный сервер. Я могу загрузить локальный файл с таким же именем на удаленный сервер. Теперь я хочу загрузить локальный файл (пример - test.txt) с другим именем (пример - test_20180601.txt) на удаленный сервер. Сейчас я использую код ниже. Как я могу изменить этот код, чтобы изменить имя файла?

@Configuration
@EnableConfigurationProperties(GcaSftpConfig.class)
@ConditionalOnProperty(prefix = "sftp.gca", name = "active", matchIfMissing = true)
public class GcaSftpUploadProcess 
{
    @Autowired
    private GcaSftpConfig config;

    @Bean(name = "gcaUploadSftpSessionFactory")
    public SessionFactory<LsEntry> sftpSessionFactory() 
    {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
        factory.setHost(config.getUpload().getHost());
        factory.setPort(config.getUpload().getPort());
        factory.setUser(config.getUpload().getUser());
        factory.setPassword(config.getUpload().getPassword());
        factory.setTimeout(config.getUpload().getTimeout());
        factory.setAllowUnknownKeys(true);
        return factory;
     }

    @Bean(name = "gcaUploadSftpRemoteFileTemplate")
    public SftpRemoteFileTemplate sftpRemoteFileTemplate() throws Exception
   {
        SftpRemoteFileTemplate template = new SftpRemoteFileTemplate(sftpSessionFactory());
        template.setRemoteDirectoryExpression(new LiteralExpression(config.getUpload().getRemoteDirectory()));
        template.afterPropertiesSet();      
        return template;
    }

    public void upload(String localFileNameWithPath)
    {
        File file = new File(localFileNameWithPath);
        Message<File> message = MessageBuilder.withPayload(file).build();
        String send = sftpRemoteFileTemplate().send(message, FileExistsMode.REPLACE);       
    }
}

person user1020455    schedule 01.06.2018    source источник


Ответы (1)


У RemoteFileTemplate есть такая опция:

/**
 * Set the file name generator used to generate the remote filename to be used when transferring
 * files to the remote system. Default {@link DefaultFileNameGenerator}.
 * @param fileNameGenerator the file name generator.
 */
public void setFileNameGenerator(FileNameGenerator fileNameGenerator) {
person Artem Bilan    schedule 01.06.2018
comment
А генератор по умолчанию использует private volatile Expression expression = EXPRESSION_PARSER.parseExpression("headers['" + FileHeaders.FILENAME + "']");, поэтому вы можете использовать .setHeader() в построителе сообщений. - person Gary Russell; 01.06.2018
comment
Большое спасибо, Гэри, я использовал заголовок, чтобы изменить имя файла, и это сработало. - person user1020455; 01.06.2018