博客
关于我
springBoot 使用 SFTP
阅读量:737 次
发布时间:2019-03-21

本文共 4594 字,大约阅读时间需要 15 分钟。

Spring Boot实现SFTP文件上传与下载

背景与意义

近期,由于系统迁移到Docker容器,并采用Spring Boot框架进行微服务治理,批量文件服务器的实现从FTP逐步升级到SFTP。为了简化开发,提高文件传输的安全性和可靠性,我们在Spring Boot的基础上对 Previously FTP实现进行了重新设计。


SFTP概述

SFTP(Secure File Transfer Protocol,安全文件传输协议)是基于SSH协议的一种文件传输方式。它结合了文件传输和加密认证技术,相较于普通的FTP,具有以下优势:

  • 安全性高:数据传输过程中采用加密方式,防止被窃听或篡改。
  • 可靠性强:通过SSH协议,连接建立在传统的TCP/IP基础之上,连接稳定性更高。
  • 隐蔽性:不容易被防火墙和入侵防御系统拦截。

不过,由于加密传输的特性,传输效率比常规FTP要稍低一些。


Java实现详解

Maven依赖

com.jcraft
jsch
0.1.54

说明:这里采用了JSch库,它是Java实现的SFTPv3协议客户端,能够满足SFTP文件传输的需求。


SFTP工具类实现

1. 配置文件封装

class SftpConfig {    private String hostname;    private Integer port;    private String username;    private String password;    private Integer timeout;    private Resource privateKey;    private String remoteRootPath;    private String fileSuffix;    public String getHostname() { return hostname; }    public void setHostname(String hostname) { this.hostname = hostname; }    // 其他字段 getter 和 setter 方法类似}

说明:SftpConfig类用于封装SFTP连接的相关配置参数,包括主机名、端口号、用户名、密码等。privateKey字段用于指定SSH密钥,可以有无具体取用。


2. SFTP工具类

public class SFTP {    private static final Logger logger = LoggerFactory.getLogger(SFTP.class);        // 获取SFTP实例并建立连接    public ChannelSftp connect(SftpConfig config) {        ChannelSftp sftp = null;        try {            JSch jsch = new JSch();            Session session = jsch.getSession(config.getUsername(), config.getHostname(), config.getPort());            logger.info("Session created ... UserName={}, Host={}, Port={}", config.getUsername(), config.getHostname(), config.getPort());            session.setPassword(config.getPassword());            Properties sshConfig = new Properties();            sshConfig.put("StrictHostKeyChecking", "no");            session.setConfig(sshConfig);            session.connect();            logger.info("Session connected ...");                        Channel channel = session.openChannel("sftp");            channel.connect();            sftp = (ChannelSftp) channel;            logger.info("登录成功");                    } catch (Exception e) {            logger.error("Session creation failed... ", e);            try {                Thread.sleep(3000);                connect(config);            } catch (Exception e1) {                logger.error("Reconnect failed ... ", e1);                throw new RuntimeException("文件上传下载异常");            }        } finally {            disConnect(sftp);        }        return sftp;    }    // 其他方法包括上传、下载、文件删除、目录列表等}

说明:连接SFTP服务器的关键方法实现,支持自动重连处理以提高稳定性。模糊连接过程中的异常处理,确保系统不会因网络问题而崩溃。


3. 测试类实现

public class TestSFTP {    private static final Logger logger = LoggerFactory.getLogger(TestSFTP.class);    public static void main(String[] args) {        // 初始化SFTP工具实例        SFTP sftp = new SFTP();                // 配置SftpConfig实例        SftpConfig config = new SftpConfig("10.0.155.55", 22, "test", "test", 3000, "/opt/bdepfile/bdp/tset/20190425");                try {            List
files = sftp.listFiles("/opt/bdepfile/bdp/pucms/20190108", config); logger.info("上传文件列表: {}", files); } catch (SftpException e) { logger.error("文件传输异常: {}", e.getMessage()); throw new RuntimeException("文件上传下载失败"); } }}

说明:测试类用于验证SFTP工具类的核心功能,包括文件传输和目录查询等操作。通过模拟真实环境下的数据,可以快速验证工具类的正确性。


SFTP文件传输的扩展实现

在Spring Boot环境中,可以采用自动装配的方式来初始化SFTP连接器,提升开发效率。以下是核心实现细节:

1. 自动装配SFTP连接器

@Configurationpublic class SftpClientConfigure {    // 通道类型标识    private static final String CHANNEL_TYPE = "sftp";    private static final Logger logger = LoggerFactory.getLogger(SftpClientConfigure.class);    @ConfigurationProperties(prefix = "sftp")    @Bean("coreSftpChannel")    public ChannelSftp channel(@Lazy @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) Session session) throws JSchException {        logger.info("初始化SFTP连接...");        Channel channel = session.openChannel(CHANNEL_TYPE);        channel.connect();        return (ChannelSftp) channel;    }    // 其他配置方法类似...}

2. 参数配置文件

sftp.hostname=10.0.155.55sftp.port=22sftp.username=testsftp.password=testsftp.timeout=3000sftp.remotepath=/opt/bdepfile/bdp/tsetsftp.localpath=D:/coresftp.filenames=duebillInfo_%s.dat, repayInfo_%s.dat

说明:配置文件中,filenames参数指定了支持的文件类型格式,remotepathlocalpath分别指定了远程和本地的路径。通过动态替换这些配置,可以支持多种文件类型的批量传输。


3. 测试与验证

通过命令工具(如Git Bash)运行测试脚本:

cd D:\corell 20190425./duebillInfo_20190425.dat./repayInfo_20190425.dat

验证结果:应该可以看到指定文件路径下的duebillInfo_20190425.datrepayInfo_20190425.dat文件。如果文件缺失,应检查传输参数和路径配置。


总结

通过以上实现,可以在Spring Boot环境中实现高效的SFTP文件传输功能。系统采用自动装配和依赖注入的方式,简化了配置管理,提高了开发效率。用户可以根据实际需求调整配置参数,支持多种文件传输场景。完整代码和配置示例可参考GitHub仓库项目链接

转载地址:http://cpygz.baihongyu.com/

你可能感兴趣的文章
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>
MYSQL中 find_in_set() 函数用法详解
查看>>
MySQL中auto_increment有什么作用?(IT枫斗者)
查看>>
MySQL中B+Tree索引原理
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>