美文网首页
SpringBoot集成sftp

SpringBoot集成sftp

作者: 爱的旋转体 | 来源:发表于2024-05-29 15:41 被阅读0次

1、添加maven依赖

        <dependency>
            <groupId>org.springframework.integration</groupId>
            <artifactId>spring-integration-sftp</artifactId>
            <version>${spring-integration.version}</version>
        </dependency>

2、sftp配置

sftp:
  host:
  port:
  user:
  password:
package com.xzp.config;

import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.Map;

@ConfigurationProperties(prefix = "sftp")
@Data
public class SftpProperties {

    private String host;
    private Integer port;
    private String user;
    private String password;
    private String privateKey;
    private String privateKeyPassphrase;
    private Boolean allowUnknownKeys = true;
    private String knownHosts;
    private Boolean sharedSession = true;
    private String remoteDirectory = "";
    private String temporaryFileSuffix = ".tmp";
    private Boolean useTemporaryFileName = true;
    private Boolean autoCreateDirectory = true;
}
package com.xzp.config;

import com.jcraft.jsch.ChannelSftp;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.expression.common.LiteralExpression;
import org.springframework.integration.file.remote.session.CachingSessionFactory;
import org.springframework.integration.sftp.session.DefaultSftpSessionFactory;
import org.springframework.integration.sftp.session.SftpRemoteFileTemplate;

import javax.annotation.Resource;

@ConditionalOnProperty(
        prefix = "sftp",
        value = {"host","port","user"}
)
@EnableConfigurationProperties(SftpProperties.class)
@Configuration
public class SftpConfiguration {

    @Resource
    private SftpProperties sftpProperties;

    @Bean
    public DefaultSftpSessionFactory sftpSessionFactory() {
        DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(sftpProperties.getSharedSession());
        factory.setHost(sftpProperties.getHost());
        factory.setPort(sftpProperties.getPort());
        factory.setUser(sftpProperties.getUser());
        if(StringUtils.isNotBlank(sftpProperties.getPrivateKey())){
            factory.setPrivateKey(new ClassPathResource(sftpProperties.getPrivateKey()));
            factory.setPrivateKeyPassphrase(sftpProperties.getPrivateKeyPassphrase());
        }else{
            factory.setPassword(sftpProperties.getPassword());
        }
        if(StringUtils.isNotBlank(sftpProperties.getKnownHosts())){
            factory.setKnownHostsResource(new ClassPathResource(sftpProperties.getKnownHosts()));
        }else{
            factory.setAllowUnknownKeys(sftpProperties.getAllowUnknownKeys());
        }
        return factory;
    }

    @Bean
    public CachingSessionFactory<ChannelSftp.LsEntry> cachingSessionFactory(){
        CachingSessionFactory<ChannelSftp.LsEntry> cachingSessionFactory = new CachingSessionFactory<>(sftpSessionFactory());
        cachingSessionFactory.setPoolSize(10);
        cachingSessionFactory.setSessionWaitTimeout(10000);
        return cachingSessionFactory;
    }

    @Bean
    public SftpRemoteFileTemplate sftpRemoteFileTemplate() {
        SftpRemoteFileTemplate sftpRemoteFileTemplate = new SftpRemoteFileTemplate(cachingSessionFactory());
        sftpRemoteFileTemplate.setRemoteDirectoryExpression(new LiteralExpression(sftpProperties.getRemoteDirectory()));
        sftpRemoteFileTemplate.setTemporaryFileSuffix(sftpProperties.getTemporaryFileSuffix());
        sftpRemoteFileTemplate.setUseTemporaryFileName(sftpProperties.getUseTemporaryFileName());
        sftpRemoteFileTemplate.setAutoCreateDirectory(sftpProperties.getAutoCreateDirectory());
        return sftpRemoteFileTemplate;
    }

}

3、封装方法

package com.xzp.service;

import cn.hutool.core.lang.Assert;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.sftp.session.SftpRemoteFileTemplate;
import org.springframework.integration.support.MessageBuilder;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.Objects;

@Slf4j
@Component
public class SftpService {

    @Autowired(required = false)
    private SftpRemoteFileTemplate sftpRemoteFileTemplate;

     /**
     * 上传文件
     *
     * @param localFilePath 本地文件路径
     * @param remoteFileDir 远程文件目录
     * @return true-成功,false-失败,null-没有开启sftp
     */
    public Boolean upload(String localFilePath, String remoteFileDir) {
        if(Objects.isNull(sftpRemoteFileTemplate)){
            return null;
        }
        Assert.notBlank(localFilePath, "本地文件路径不能为空");
        Assert.notBlank(remoteFileDir, "远程文件目录不能为空");
        log.info("上传文件到sftp, localFilePath:[{}], remoteFileDir:[{}]", localFilePath, remoteFileDir);
        remoteFileDir = remoteFileDir.endsWith(File.separator) ? remoteFileDir : remoteFileDir + File.separator;
        try {
            Message<File> message = MessageBuilder.withPayload(new File(localFilePath)).build();
            String result = sftpRemoteFileTemplate.send(message, remoteFileDir);
            log.info("上传文件到sftp, 响应结果:[{}]", result);
            return true;
        } catch (Exception e) {
            log.error("上传文件到sftp异常, localFilePath:[{}], remoteFileDir:[{}], 异常信息:[{}]", localFilePath, remoteFileDir, e.getMessage(), e);
            return false;
        }
    }
}

相关文章

网友评论

      本文标题:SpringBoot集成sftp

      本文链接:https://www.haomeiwen.com/subject/oxclqjtx.html