[dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。

前言

最近在开发订单对账系统,先从各种支付平台获取订单销售数据,然后与公司商城订单数据进行对账兜底。总体上,各个支付平台提供数据的方式分为两类,一般以接口的方式提供实时数据,比如:webservice、NVP、restfull api,以文件服务的方式提供周期性数据,比如:SFTP。接口的方式比较简单,随便一个HTTP客户端库都能搞定,而SFTP文件下载服务就不一样了,至少需要满足三个条件,不然对接起来就相当麻烦。

  1. 支持密码认证
  2. 支持安全密钥认证
  3. 支持根据按文件命名策略检索文件,即支持正则检索文件

经过调研发现了一个非常好用,且文档全面的SFTP客户端库:

  1. GitHub
  2. 官方文档

这个库由componentpro出品,此公司还提供了其它的工具库,功能非常强大,如下:

从上面可以看出,不仅提供FTP client/server、SFTP client/server的库,还提供了Mail、Excel、SAML、PDF的库,真的是太强大了,经过实验也发现它的SFTP封装的真的好用。

如何封装

作者已经使用SFTP Library封装并实现了以上三点需求,代码结构如下:

这里就不赘述代码设计了,感兴趣请自行查看源码。

地址:https://github.com/justmine66/Samples/tree/master/SFTP/SFtpDownloader

如何使用

请先安装包:Install-Package SFTP.Downloader -Version 1.0.0

1. 实现文件命名策略接口

public class FileNamingStrategy : IFileNamingStrategy
{
    public string GetFileRegexName()
    {
        return $"test.csv";
    }
}

2. 配置文件下载器

new ServiceCollection()
.AddSFtpServices(builder =>
{
    // 1. 注册命名服务,用于按需检索文件。
    builder.AddNamingStrategy<FileNamingStrategy>();
    // 2. 认证方案(任选其一)
    // 2.1 密码
    builder.UsePwdAuthTScheme("sftp-host", "userName", "pwd", "/upload/");
    // 2.2 安全密钥
    builder.UseSecurityKeyAuthTScheme("sftp-host", "userName", "SFtpDownloader.test.ppk", "/upload/");
});

备注:当使用安全密钥认证方案时,请将私钥设置为嵌入式资源。

3. 使用文件下载器

private readonly ILogger _logger;
private readonly IFilesDownloader _downloader;

public Engine(ILogger<Engine> logger, IFilesDownloader downloader)
{
    _logger = logger;
    _downloader = downloader;
}

public async Task StartAsync(CancellationToken cancellationToken)
{
    var files = await _downloader.DownloadAsync(1);
    _logger.LogInformation($"The files downloaded: {files.Aggregate((x, y) => $"{x},{y}")}.");
}

当需要在运行时才能注入配置时,还可以传入参数options,比如:

var files = await _downloader.DownloadAsync(1, options: new SFtpOptions(){
    Host = "sftp-host",UserName="userName",Password="pwd",RemoteDirectory="/upload"
});

示例github项目地址:https://github.com/justmine66/Samples/tree/master/SFTP/SFtpDownloader.Test

使用起来就是这么简单!!!

总结

本篇首先介绍了实现一个SFTP文件下载器,需要满足的基本需求,然后使用SFTP Library封装了一个既简单又好用的SFTP文件下载器,最后演示了如何使用此库。

最后

如果有什么疑问和见解,欢迎评论区交流。
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
如果你对dotnet感兴趣的话可以关注我,我会定期的在博客分享我的学习心得。
未经允许不得转载,转载请在明显位置给出出处及链接

原文地址:https://www.cnblogs.com/justmine/p/10778459.html

时间: 2024-08-23 21:38:27

[dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。的相关文章

使用putty,xshell密码和密钥认证2种方式远程连接Linux

putty 链接:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html xshell  链接:https://pan.baidu.com/s/1jICI3Ka  密码:tlwn 1.9   putty 密码认证方式 打开putty,windows-lines of scrollbar 支持屏幕上下滚动行数. windows-Appearance-change-调整字体 windows-Translation-Remote..

Xshell配置ssh免密码登录-密钥公钥(Public key)

1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步: 1.生成密钥(公钥与私钥): 2.放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中: 3.配置ssh客户端使用密钥登录. 1.1 生成密钥(公钥与私钥) 打开Xshell,在菜单栏点击“工具”,在弹出的菜单中选择“(新建用户密钥生成向导)”,如下图:   弹出“

从零封装一个Android大图查看器

背景: 大图查看器是许多app的常用功能,主要使用场景是用户点击图片,然后启动一个新界面来展示图片的完整尺寸,并能通过手势移动图片以及放大缩小.当然,上面说的是最基本的功能,实际使用中还要包括:如果是本地图片应该可以移除,如果是网络图片,应提供一个保存到本地的功能等. 本文为什么叫封装一个大图查看器,而不是叫做编写一个大图查看器呢?因为大图查看器的最核心功能,展示图片以及手势操控我们使用了一个开源库来完成,这个开源库叫做subsampling-scale-image-view,这个开源库非常靠谱

数组的方法(连接,截取,删除,插入,替换,以及封装一个函数)

连接两个数组:concat,形成一个新数组 数组1.concat(数组2,数组1) 返回值:数组 var arr1=[1,2], arr2=[3,4], arr3; arr3=arr1.concat(arr2,arr1); console.log(arr3); 另外方法,截取<是来是>__.slice(start,end) ___.slice(start,end)功能:从已有的数组中返回选定的元素 参数 如果参数有一个是负数,则用数组长度加上该数来确定相应的位置 start(必须)规定从何处开

高性能封装检测浏览器支持css3属性函数

css3出来已经很久了,现在来谈判断浏览器是否支持某个css3的属性虽说有点过时了,但是还是可以谈谈的,然后,此篇主要谈的不是判断是否支持,而是怎么封装更好,为什么这么封装,欢迎吐槽. 入题,判断浏览器是否支持css3 transition,方法很简单,只需要下面这句代码就行了: 'transition' in document.body.style chrome和ie支持document.body,但是Firefox不支持,Firefox支持document.documentElement,对

openssl与java(读取加密码的密钥)

最近在研究java security方面的东西,java自带可以使用各种加密解密算法(rsa,dsa,des3,aes,md5...),但往往一些密钥是第三方给我们的,我们需要用java装载这些密钥然后加密或者解密,其中生成密钥的工具不得不得说到openssl,之前也介绍过,如何用openssl生成 rsa密钥,并用java代码去加密解密:http://www.cnblogs.com/foreveravalon/p/7095247.html 然而,往往我们读取私钥时需要使用密码,openssl虽

Xshell配置ssh免密码登录-密钥公钥(Public key)与私钥(Private Key)登录

ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步:1.生成密钥(公钥与私钥):2.放置公钥(Public Key)到服务器~/.ssh/authorized_key文件中:3.配置ssh客户端使用密钥登录. 一.生成密钥公钥(Public key)与私钥(Private Key) 打开Xshell,在菜单栏点击"tools",在弹出的菜单中选择&quo

封装一个运动函数

1 //支持 缓冲 + 多物体 + 链式 + 完美 2 //obj:运动的对象 3 //json:存储多个attr和target 4 //callback :回调函数 代表一个功能 当一个函数作为参数时,这样的函数叫做回调函数 5 function startMove(obj,json,callback){ 6 clearInterval( obj.timer );//在运动之前先清空定时器 7 obj.timer = setInterval( function(){ 8 var flag =

Python+Selenium进阶版(八)- Python自定义封装一个简单的Log类

目标:如何写一个Python日志类,用来输出不同级别的日志信息到本地文件夹下的日志文件里. 练习场景: 我们需要封装一个简单的日志类,主要有以下内容: 1.生成的日志文件格式是 年月日分秒.log 2.生成的XXX.log文件存储在项目根目录下Logs文件夹下 3.这个日志类,支持INFO,ERROR两种日志级别 4.日志里,每行日志输出,时间日期+执行类名称+日志级别+日志描述 解决思路: 1.在根目录下新建一个Logs的文件夹,获取这个Log的相对路径: 2.日志的保存命名,需要系统时间: