實現一個基於碼雲的Storage

来源:https://www.cnblogs.com/weihanli/archive/2019/09/10/implement-a-storage-provider-based-on-gitee.html

上次在 asp.net core 從單機到集群 一文中提到存儲還不支持分散式,並立了一個 flag > 基於 github 或者 開源中國的碼雲實現一個 storage 於是這兩天就來填坑了。。 ...


實現一個簡單的基於碼雲(Gitee) 的 Storage

Intro

上次在 asp.net core 從單機到集群 一文中提到存儲還不支持分散式,並立了一個 flag

基於 github 或者 開源中國的碼雲實現一個 storage

於是這兩天就來填坑了。。

實現了一個簡單的基於開源中國的碼雲的 storage

準備工作

碼雲官方有 API 介面列表 https://gitee.com/api/v5/swagger

上傳文件API: https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoContentsPath

上傳文件API參數信息

新建一個倉庫來存我們要保存的文件,新建的時候分支模型選擇預設的單分支模型即可,只要master分支即可 ,最好直接創建 readme 或者新加一個文件以創建分支:

然後需要創建一個 accessToken,在 設置里的私人令牌配置中新建一個token,需要 projects 許可權

Storage 簡單實現

參考上面 Gitee 提供的 API 介面,自己實現了一個簡單的 GiteeStorageProvider ,Github 完整源碼:https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.Common/StorageProvider.cs

/// <summary>
/// 碼雲存儲
/// </summary>
public class GiteeStorageProvider : IStorageProvider
{
    private const string PostFileApiUrlFormat = "https://gitee.com/api/v5/repos/{0}/{1}/contents{2}";
    private const string RawFileUrlFormat = "https://gitee.com/{0}/{1}/raw/master{2}";

    private readonly HttpClient _httpClient;
    private readonly ILogger _logger;
    private readonly GiteeStorageOptions _options;

    public GiteeStorageProvider(HttpClient httpClient, ILogger<GiteeStorageProvider> logger, IOptions<GiteeStorageOptions> options)
    {
        _logger = logger;
        _httpClient = httpClient;
        _options = options.Value;
    }

    public async Task<string> SaveBytes(byte[] bytes, string filePath)
    {
        var base64Str = Convert.ToBase64String(bytes);
        using (var response = await _httpClient.PostAsFormAsync(PostFileApiUrlFormat.FormatWith(_options.UserName, _options.RepositoryName, filePath),
            new Dictionary<string, string>
            {
                { "access_token", _options.AccessToken },
                { "content", base64Str },
                { "message" , $"add file" }
            }))
        {
            if (response.IsSuccessStatusCode)
            {
                return RawFileUrlFormat
                    .FormatWith(_options.UserName, _options.RepositoryName, filePath);
            }

            var result = await response.Content.ReadAsStringAsync();
            _logger.LogWarning($"post file error, response: {result}");

            return null;
        }
    }
}

public class GiteeStorageOptions
{
    public string UserName { get; set; }

    public string RepositoryName { get; set; }

    public string AccessToken { get; set; }
}

服務註冊,這裡用了 HttpClientFactory 來使用 HttpClient,個人比較喜歡用強類型的 HttpClient,如果喜歡使用通過 IHttpClientFactory 來顯示創建,也可以註入一個 IHttpClientFactory ,在內部創建 HttpClient

services.Configure<GiteeStorageOptions>(Configuration.GetSection("Storage:Gitee"));
services.AddHttpClient<IStorageProvider, GiteeStorageProvider>();
services.TryAddSingleton<IStorageProvider, GiteeStorageProvider>();

配置示例:

{
  "Storage":{
    "Gitee":{
      "UserName": "weihanli",
      "RepositoryName": "storage",
      "AccessToken": "xxx"
    }
  }
}

使用效果

可以看到上傳的圖片已經上傳到我們新建的倉庫了,到倉庫里看一下:

More

只實現了上傳,本來想也加一個列出某個目錄下的所有文件及子目錄,但是看好像沒有介面,如果要實現的話,可能只能基於 git 去實現,從 git 信息里獲取,暫時不怎麼用到,先不管了,暫時擱置吧,

Reference


您的分享是我們最大的動力!

更多相關文章
  • 一、static關鍵字 下麵我設計了一個房貸利率上浮類(用來計算房貸利率上浮多少): 上面例子的問題在於基準利率這個屬性是所有房貸利率上浮對象共用的屬性,而不是每個房貸利率上浮對象都擁有一個基準利率。所以要把基準利率這個屬性設置成共用的需要使用static關鍵字,第二版房貸利率上浮類: 靜態自動屬性 ...
  • 在java的spring中有自動註入功能,使得代碼變得更加簡潔靈活,所以想把這個功能移植到c#中,接下來逐步分析實現過程 1.使用自動註入場景分析 在asp.net mvc中,無論是什麼代碼邏輯分層,最終的表現層為Controller層,所以我們註入點就是在Controller中,這裡我們需要替換默 ...
  • EF 6及以前的版本是預設支持延遲載入(Lazy Loading)的,早期的EF Core中並不支持,必須使用Include方法來支持導航屬性的數據載入。 當然在 EF Core 2.1 及之後版本中已經引入了延遲載入功能,詳細實現原理可以查看官網( "傳送門" )。 下麵記錄一下,分別使用Incl ...
  • 按照目前的軟體開發發展趨勢中,不管是前後端分離還是提供數據服務,WebApi使用的越來越廣泛,而且.NET Core也是我們.NET開發人員未來發展的趨勢,所以說學會使用.NET Core Api是非常有必要的。 本人作為一個.NET菜鳥,正在慢慢的學習中,將學到的一步一步記錄下來。 一、創建項目 ...
  • 官網地址:https://framework7.io/docs/autocomplete.html#autocomplete-parameters 效果圖: <meta charset="UTF-8"><meta name="viewport" content="width=device-width ...
一周排行
  • 首先給大家介紹一下序列化是用來乾什麼的,他為什麼出現 序列化這種技術說到底其實就是把臨時數據保存在電腦上。大家都知道對於程式而言對象是一種稍縱即逝的數據,不僅僅是程式重啟、電腦重啟,就連內部函數的變化也有可能導致對象的消失,但是總有一些對象是大家不想讓其隨意消失的並且想在下一次開啟程式的時候進行載入 ...
  • 一、前言 在.Net Framework框架有專門獲取webconfig配置的方法供我們使用,但是在.Net Core或者.Net Standard中沒有可以直接使用的方法來獲取配置文件信息,下麵就來實現獲取配置信息。 二、獲取配置信息的實現 在.Net Core中,他的配置信息的載體是一個json ...
  • 你一定看過這篇文章 《進擊的 Java ,雲原生時代的蛻變》, 本篇文章的靈感來自於這篇文章。北京時間9.24 就將正式發佈.NET Core 3.0, 所以寫下這篇文章讓大家全面認識.NET Core。.NET 生態系統是一個不斷變化的生態圈,我相信它正在朝著一個偉大的方向發展。正好 最近 Inf... ...
  • 參考文檔:Dapper one to many Table C Code pulic List GetPersons(){ var sql = @"SELECT 1 AS Id, 'Daniel Dennett' AS Name, 1942 AS Born, 1 AS CountryId, 'Uni ...
  • 非標設備多相機流水線模式緩存圖片(C/S客戶端,c 開發語言) ​ 本文所說流水線方式下存儲圖像是在軟體測量周期慢於圖片周期前提下講解的,如果軟體一直在等待圖片數據,邏輯就沒有那麼複雜。 1、非標設備項目,常規模式測量流程 常規模式下,相機採集圖像信號由上位機控制(無論軟觸發、硬觸發)。每個周期內的 ...
  • 簡單創建.NET Core WebApi:https://www.cnblogs.com/yanbigfeg/p/9197375.html 登陸驗證四種方式:https://www.cnblogs.com/zuowj/p/5123943.html 解決跨域的8種方法:https://blog.csd ...
  • 最近有個需求就是網頁表格裡面的數據導出到excel 於是從各位前輩的博客園搜了搜demo 大部分非為兩類 都是用的插件NPOI和Eppluse ,因此在這裡就介紹Eppluse 用法,還有就是在博客的時候 好多有留言說想看從資料庫裡面的數據進行導入 而不是寫死的,所以我就以我的案例給大家分享下用法( ...
  • 表達式樹練習實踐:C 值類型、引用類型、泛型、集合、調用函數 [TOC] 一,定義變數 C 表達式樹中,定義一個變數,使用 。 創建變數結點的方法有兩種, 兩種方式都是生成 類型 和 都具有兩個重載。他們創建一個 ParameterExpression節點,該節點可用於標識表達式樹中的參數或變數。 ...
  • 就像是.NET Framework WebApi與.NET Core WebApi一樣,.NET Framework MVC與.NET Core MVC的區別,也是框架的之間的區別。本系列先首先從.NET Framework MVC介紹,後面再去介紹.NET Core MVC 狹義MVC: MVC是 ...
  • 緩存的實現 我們不是做第三方比如Redis等的緩存實現,而是根據實際情況,基於C#上做一些環境變數的保存,方便項目使用。 1、系統全局變數 很多時候,在系統運行開始,需要對系統的運行參數進行保存,以便供全局使用。 代碼如下: 這裡使用一個靜態變數的Dictionary來進行保存,所有項目均可以直接獲 ...
x