實現一個基於碼雲的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM