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
相关产品推荐
相关产品推荐

