博客
关于我
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/

你可能感兴趣的文章
nginx配置域名和ip同时访问、开放多端口
查看>>
Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
查看>>
Nginx配置如何一键生成
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>