[dotnet] 封裝一個同時支持密碼/安全密鑰認證的SFTP下載器,簡單易用。

前言

最近在開發訂單對帳系統,先從各類支付平臺獲取訂單銷售數據,而後與公司商城訂單數據進行對帳兜底。整體上,各個支付平臺提供數據的方式分爲兩類,通常以接口的方式提供實時數據,好比:webservice、NVP、restfull api,以文件服務的方式提供週期性數據,好比:SFTP。接口的方式比較簡單,隨便一個HTTP客戶端庫都能搞定,而SFTP文件下載服務就不同了,至少須要知足三個條件,否則對接起來就至關麻煩。git

  1. 支持密碼認證
  2. 支持安全密鑰認證
  3. 支持根據按文件命名策略檢索文件,即支持正則檢索文件

通過調研發現了一個很是好用,且文檔全面的SFTP客戶端庫:github

  1. GitHub
  2. 官方文檔

這個庫由componentpro出品,此公司還提供了其它的工具庫,功能很是強大,以下:web

從上面能夠看出,不只提供FTP client/server、SFTP client/server的庫,還提供了Mail、Excel、SAML、PDF的庫,真的是太強大了,通過實驗也發現它的SFTP封裝的真的好用。c#

如何封裝

做者已經使用SFTP Library封裝並實現了以上三點需求,代碼結構以下:api

這裏就不贅述代碼設計了,感興趣請自行查看源碼。安全

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

如何使用

請先安裝包:Install-Package SFTP.Downloader -Version 1.0.2,實際使用時,請使用最新版本。async

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感興趣的話能夠關注我,我會按期的在博客分享個人學習心得。
未經容許不得轉載,轉載請在明顯位置給出出處及連接

相關文章
相關標籤/搜索