实现一个简单的基于码云(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

新建一个仓库来存我们要保存的文件,新建的时候分支模型选择默认的单分支模型即可,只要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

实现一个基于码云Storage的更多相关文章

  1. 实现一个基于码云的Storage

    实现一个简单的基于码云(Gitee) 的 Storage Intro 上次在 asp.net core 从单机到集群 一文中提到存储还不支持分布式,并立了一个 flag 基于 github 或者 开源 ...

  2. 今天遇到一个git码云同步的问题

    一开始是因为eclipse编码不同意导致乱码,所以我和师弟就想统一都用UTF-8的,师弟统一好了,让我pull一下,pull的时候有冲突,因为我和师弟都修改了其中一个文件,然后我这边就删除了那个文件再 ...

  3. 记录一下mac上码云的使用

    项目比较多的时候用第三方的托管平台管理自己的代码还是挺不错的,记录一下码云的基本使用 分两部分进行说明: 一 :怎么上传自己本地的代码到码云.(方式,通过终端输入命令行) 具体的步骤: 1 :首先得在 ...

  4. Android/AndroidStudio/idea使用教程之git使用(详细)(码云)

    已经安装好了AndroidStudio,安装教程 本教程是作者自己摸索出来的,有不足之处还请大家海涵.多多拍砖,互相学习. 第一步:下载git,安装git客户端 直接百度git,下载git ​ 安装g ...

  5. 我的一个git(码云)之旅

    合作开发项目,你就会用到git,现在码云比较简单,因为是中文化界面,学习起来难度比较低,又支持5人以下项目免费,所以学习码云更好入手一点. 下面的东西适合一些个基础比较低的用户学习,因为我就是啊... ...

  6. 一个基于php+mysql的外卖订餐网站(带源码)

    订饭组 一个基于php+mysql的外卖订餐网站,包括前端和后台.源码地址 源码演示地址:http://dingfanzu.com 商家后台系统:http://dingfanzu.com/admin ...

  7. 学习将码云账号和git连接,并且创建一个项目

    一顿操作猛如虎,哈哈 参考网址:https://git-scm.com/book/zh/v1/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7 ...

  8. 怎么在本地建立一个Maven 项目push到码云(https://git.oschina.net)

    本地建立一个的mvan项目不使用SmartGit push到码云上. 1 首先在自己码云的建立一个maven 空项目 2 然后打开STS(Spring Tool Suite)   新建一个Maven( ...

  9. 用mkdocs在gitee码云上建立一个简单的文档博客

    利用mkdocs建立简单的文档博客 一.概述 MkDocs 是一个用于创建项目文档的 快速, 简单 , 完美华丽 的静态站点生成器. 文档源码使用 Markdown 来撰写, 用一个 YAML 文件作 ...

随机推荐

  1. 并发编程(3)——ThreadPoolExecutor

    ThreadPoolExecutor 1. ctl(control state) 线程池控制状态,包含两个概念字段:workerCount(线程有效数量)和runState(表示是否在运行.关闭等状态 ...

  2. react解析: render的FiberRoot(三)

    react解析: render的FiberRoot(三) 感谢 yck: 剖析 React 源码解析,本篇文章是在读完他的文章的基础上,将他的文章进行拆解和加工,加入我自己的一下理解和例子,便于大家理 ...

  3. CSS3: perspective 3D属性

    本文引自:http://blog.csdn.net/cddcj/article/details/52956540 perspective 属性指定了观察者与z=0平面的距离,使具有三维位置变换的元素产 ...

  4. JavaWeb——Servlet开发2

    1.HttpServletRequest的使用 获取Request的参数的方法. 方法getParameter将返回参数的单个值 方法getParameterValues将返回参数的值的数组 方法ge ...

  5. cookie session sessionStorage localStorage

    什么是会话? 会话指的是浏览器与服务器之间的数据交互.所白了就是 浏览器和服务器进行的请求和响应. http协议是无状态的,多次请求之间没有关联性 cookie和session的作用?干啥的? 利用c ...

  6. 垂直渐变的Button

    public partial class RoundButton : Button { Rectangle r; private Brush _myBrush = null; , , ); , , ) ...

  7. 腾讯PCG(后台开发) 牛客网视频面试 一面

    腾讯视频面试 作为一个小渣渣记录一下,腾讯是我一直想进的公司,但其实准备的时间不是很长,也不是科班还是存在很大的劣势,记录一下找工作的经历. 首先说一下,这是我第一次视频面试,还是蛮紧张的.不过面试官 ...

  8. Mysql优化(出自官方文档) - 第八篇(索引优化系列)

    目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...

  9. SQL Server避免漏加where条件导致的批量误操作

    很多开发人员,包括数据库管理员都有马失前蹄的时候,update/delete时忘记了添加where条件,导致不必要的麻烦.一旦失误,必须要尝试各种恢复手段来恢复数据,尤其是正在使用的生产数据库,造成的 ...

  10. h5中div边距去除

    style样式里面加上 <style> *{ margin:0 ;//外边距为0 padding:0;//内边距为0 } </style>