You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring SFTP上传文件时修改远程文件名的实现方案问询

修改Spring SFTP上传时的远程文件名

你现在的代码已经实现了基础的SFTP上传,但默认会沿用本地文件的名称作为远程文件名。要实现自定义远程文件名,我们可以利用Spring Integration提供的FileHeaders.REMOTE_FILE消息头来指定目标文件名,具体修改步骤如下:

步骤1:调整upload方法的参数

给upload方法新增一个参数,用来接收你想要设置的远程文件名(比如test_20180601.txt)。

步骤2:在构建Message时添加远程文件名Header

在创建Message<File>对象时,通过MessageBuilder设置FileHeaders.REMOTE_FILE头,值为目标远程文件名。Spring SFTP模块会识别这个Header,并将其作为远程服务器上的最终文件名。

修改后的完整代码

import org.springframework.integration.file.FileHeaders;
// 其他原有导入保持不变

@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; 
    } 

    // 修改后的upload方法,支持传入自定义远程文件名
    public void upload(String localFileNameWithPath, String remoteFileName) { 
        File file = new File(localFileNameWithPath); 
        Message<File> message = MessageBuilder.withPayload(file)
                // 设置远程文件名Header
                .setHeader(FileHeaders.REMOTE_FILE, remoteFileName)
                .build(); 
        String send = sftpRemoteFileTemplate().send(message, FileExistsMode.REPLACE); 
    } 
}

使用示例

当你需要上传本地的test.txt并将其命名为test_20180601.txt时,直接调用:

gcaSftpUploadProcess.upload("/path/to/local/test.txt", "test_20180601.txt");

原理说明

Spring Integration的SFTP模块在处理文件上传时,会优先读取FileHeaders.REMOTE_FILE消息头的值作为远程文件名;如果未设置这个Header,才会默认使用本地文件的原始名称。通过添加这个Header,我们就能灵活控制远程服务器上的文件名了。

内容的提问来源于stack exchange,提问作者user1020455

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:04:31