本文共 4594 字,大约阅读时间需要 15 分钟。
近期,由于系统迁移到Docker容器,并采用Spring Boot框架进行微服务治理,批量文件服务器的实现从FTP逐步升级到SFTP。为了简化开发,提高文件传输的安全性和可靠性,我们在Spring Boot的基础上对 Previously FTP实现进行了重新设计。
SFTP(Secure File Transfer Protocol,安全文件传输协议)是基于SSH协议的一种文件传输方式。它结合了文件传输和加密认证技术,相较于普通的FTP,具有以下优势:
不过,由于加密传输的特性,传输效率比常规FTP要稍低一些。
com.jcraft jsch 0.1.54
说明:这里采用了JSch库,它是Java实现的SFTPv3协议客户端,能够满足SFTP文件传输的需求。
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密钥,可以有无具体取用。
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服务器的关键方法实现,支持自动重连处理以提高稳定性。模糊连接过程中的异常处理,确保系统不会因网络问题而崩溃。
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 { Listfiles = sftp.listFiles("/opt/bdepfile/bdp/pucms/20190108", config); logger.info("上传文件列表: {}", files); } catch (SftpException e) { logger.error("文件传输异常: {}", e.getMessage()); throw new RuntimeException("文件上传下载失败"); } }}
说明:测试类用于验证SFTP工具类的核心功能,包括文件传输和目录查询等操作。通过模拟真实环境下的数据,可以快速验证工具类的正确性。
在Spring Boot环境中,可以采用自动装配的方式来初始化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; } // 其他配置方法类似...}
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
参数指定了支持的文件类型格式,remotepath
和localpath
分别指定了远程和本地的路径。通过动态替换这些配置,可以支持多种文件类型的批量传输。
通过命令工具(如Git Bash)运行测试脚本:
cd D:\corell 20190425./duebillInfo_20190425.dat./repayInfo_20190425.dat
验证结果:应该可以看到指定文件路径下的duebillInfo_20190425.dat
和repayInfo_20190425.dat
文件。如果文件缺失,应检查传输参数和路径配置。
通过以上实现,可以在Spring Boot环境中实现高效的SFTP文件传输功能。系统采用自动装配和依赖注入的方式,简化了配置管理,提高了开发效率。用户可以根据实际需求调整配置参数,支持多种文件传输场景。完整代码和配置示例可参考GitHub仓库项目链接。
转载地址:http://cpygz.baihongyu.com/