欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

实现一个基于码云的Storage

程序员文章站 2022-04-10 14:38:27
上次在 asp.net core 从单机到集群 一文中提到存储还不支持分布式,并立了一个 flag > 基于 github 或者 开源中国的码云实现一个 storage 于是这两天就来填坑了。。 ......

实现一个简单的基于码云(gitee) 的 storage

intro

上次在 一文中提到存储还不支持分布式,并立了一个 flag

基于 github 或者 开源中国的码云实现一个 storage

于是这两天就来填坑了。。

实现了一个简单的基于开源中国的码云的 storage

准备工作

码云官方有 api 接口列表

上传文件api: https://gitee.com/api/v5/swagger#/postv5reposownerrepocontentspath

实现一个基于码云的Storage

新建一个仓库来存我们要保存的文件,新建的时候分支模型选择默认的单分支模型即可,只要master分支即可 ,最好直接创建 readme 或者新加一个文件以创建分支:

然后需要创建一个 accesstoken,在 设置里的私人令牌配置中新建一个token,需要 projects 权限

实现一个基于码云的Storage

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"
    }
  }
}

使用效果

实现一个基于码云的Storage

可以看到上传的图片已经上传到我们新建的仓库了,到仓库里看一下:

实现一个基于码云的Storage

more

只实现了上传,本来想也加一个列出某个目录下的所有文件及子目录,但是看好像没有接口,如果要实现的话,可能只能基于 git 去实现,从 git 信息里获取,暂时不怎么用到,先不管了,暂时搁置吧,

reference