前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。

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

作者头像
justmine
发布2019-05-10 18:25:29
8050
发布2019-05-10 18:25:29
举报
文章被收录于专栏:容器化容器化

前言

最近在开发订单对账系统,先从各种支付平台获取订单销售数据,然后与公司商城订单数据进行对账兜底。总体上,各个支付平台提供数据的方式分为两类,一般以接口的方式提供实时数据,比如: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.2,实际使用时,请使用最新版本。

1. 实现文件命名策略接口
代码语言:javascript
复制
public class FileNamingStrategy : IFileNamingStrategy
{
    public string GetFileRegexName()
    {
        return $"test.csv";
    }
}
2. 配置文件下载器
代码语言:javascript
复制
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. 使用文件下载器
代码语言:javascript
复制
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,比如:

代码语言:javascript
复制
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文件下载器,最后演示了如何使用此库。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 如何封装
    • 如何使用
      • 1. 实现文件命名策略接口
      • 2. 配置文件下载器
      • 3. 使用文件下载器
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档