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

本文共 4678 字,大约阅读时间需要 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连接器

@Configuration
public 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.55
sftp.port=22
sftp.username=test
sftp.password=test
sftp.timeout=3000
sftp.remotepath=/opt/bdepfile/bdp/tset
sftp.localpath=D:/core
sftp.filenames=duebillInfo_%s.dat, repayInfo_%s.dat

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


3. 测试与验证

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

cd D:\core
ll 20190425
./duebillInfo_20190425.dat
./repayInfo_20190425.dat

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


总结

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

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

你可能感兴趣的文章
Nginx
查看>>
nginx + etcd 动态负载均衡实践(三)—— 基于nginx-upsync-module实现
查看>>
nginx + etcd 动态负载均衡实践(二)—— 组件安装
查看>>
nginx + etcd 动态负载均衡实践(四)—— 基于confd实现
查看>>
Nginx + Spring Boot 实现负载均衡
查看>>
Nginx + uWSGI + Flask + Vhost
查看>>
Nginx - Header详解
查看>>
Nginx - 反向代理、负载均衡、动静分离、底层原理(案例实战分析)
查看>>
nginx 1.24.0 安装nginx最新稳定版
查看>>
nginx 301 永久重定向
查看>>
nginx css,js合并插件,淘宝nginx合并js,css插件
查看>>
Nginx gateway集群和动态网关
查看>>
Nginx Location配置总结
查看>>
Nginx log文件写入失败?log文件权限设置问题
查看>>
Nginx Lua install
查看>>
nginx net::ERR_ABORTED 403 (Forbidden)
查看>>
Nginx SSL私有证书自签,且反代80端口
查看>>
Nginx upstream性能优化
查看>>
Nginx 中解决跨域问题
查看>>
nginx 代理解决跨域
查看>>