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

新建一个仓库来存我们要保存的文件,新建的时候分支模型选择默认的单分支模型即可,只要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
- https://www.jianshu.com/p/224954dadcaf
- https://gitee.com/weihanli/storage
- https://github.com/WeihanLi/ActivityReservation
实现一个基于码云的Storage的更多相关文章
- 实现一个基于码云Storage
实现一个简单的基于码云(Gitee) 的 Storage Intro 上次在 asp.net core 从单机到集群 一文中提到存储还不支持分布式,并立了一个 flag 基于 github 或者 开源 ...
- 今天遇到一个git码云同步的问题
一开始是因为eclipse编码不同意导致乱码,所以我和师弟就想统一都用UTF-8的,师弟统一好了,让我pull一下,pull的时候有冲突,因为我和师弟都修改了其中一个文件,然后我这边就删除了那个文件再 ...
- 记录一下mac上码云的使用
项目比较多的时候用第三方的托管平台管理自己的代码还是挺不错的,记录一下码云的基本使用 分两部分进行说明: 一 :怎么上传自己本地的代码到码云.(方式,通过终端输入命令行) 具体的步骤: 1 :首先得在 ...
- Android/AndroidStudio/idea使用教程之git使用(详细)(码云)
已经安装好了AndroidStudio,安装教程 本教程是作者自己摸索出来的,有不足之处还请大家海涵.多多拍砖,互相学习. 第一步:下载git,安装git客户端 直接百度git,下载git 安装g ...
- 我的一个git(码云)之旅
合作开发项目,你就会用到git,现在码云比较简单,因为是中文化界面,学习起来难度比较低,又支持5人以下项目免费,所以学习码云更好入手一点. 下面的东西适合一些个基础比较低的用户学习,因为我就是啊... ...
- 一个基于php+mysql的外卖订餐网站(带源码)
订饭组 一个基于php+mysql的外卖订餐网站,包括前端和后台.源码地址 源码演示地址:http://dingfanzu.com 商家后台系统:http://dingfanzu.com/admin ...
- 学习将码云账号和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 ...
- 怎么在本地建立一个Maven 项目push到码云(https://git.oschina.net)
本地建立一个的mvan项目不使用SmartGit push到码云上. 1 首先在自己码云的建立一个maven 空项目 2 然后打开STS(Spring Tool Suite) 新建一个Maven( ...
- 用mkdocs在gitee码云上建立一个简单的文档博客
利用mkdocs建立简单的文档博客 一.概述 MkDocs 是一个用于创建项目文档的 快速, 简单 , 完美华丽 的静态站点生成器. 文档源码使用 Markdown 来撰写, 用一个 YAML 文件作 ...
随机推荐
- HackBar收费版绕过
一段时间没用HackBar,近期做渗透,打开火狐浏览器,按F12键调出HackBar,发现居然需要收费买license才能使用. 经过研究,整理了以下两个绕过HackBar收费版的方法. 第一种:用其 ...
- sqoop增量导数据
sqoop要实现增量导入参数到hive或者hdfs 1.需要在mysql中创建可以自动更新的字段,当插入数据时和更新数据时改字段自动更新,如图中update_time,当数据插入时会记录更新为插入时间 ...
- 论文阅读 | Falcon: Balancing Interactive Latency and Resolution Sensitivity for Scalable Linked Visualizations
作者: Dominik Moritz, Bill Howe, Jeffrey Heer 发表于CHI 2019, 三位作者都来自于University of Washington Interactiv ...
- IBM实习工作(一)
2019.1.21 今天的任务是完成会计是否在岗配置表格增加操作记录,任务描述:1. [会计是否在岗配置] 查询结果界面: 修改人编码/修改人/修改时间 字段:2. 字段取值为[会计是否在 ...
- U盘重装MacOS-Sierra系统
Mac系统重新安装两种方法: 1.在线远程重装. 2.制作启动U盘进行重装. 理论上第一种比较简单,但是会比较耗时,实际操作中,由于网上下载的系统版本低于我现在MacOS的版本,导致无法安装,因此只能 ...
- LeetCode——372. Super Pow
题目链接:https://leetcode.com/problems/super-pow/description/ Your task is to calculate ab mod 1337 wher ...
- TCP/UDP对比总结
目录 1 TCP-UDP对比 2 UDP介绍 3 TCP介绍 3.1 可靠传输的原理和实现 3.1.1 可靠传输原理 3.1.2 可靠传输实现 3.2 TCP面向连接管理 3.2.1 建立连接 3.2 ...
- volatile关键字的详解-并发编程的体现
xl_echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 参 ...
- linux100day(day4)--文本处理三剑客
在介绍三剑客之前,先来认识一下通配符和正则表达式 通配符 正则表达式 作用:通过一些特殊字符,来表示一类字符内容 1.字符匹配 . 任意一个字符 [ ] 范围内的任意一个字符 [^ ] 取 ...
- 身体质量指数BMI
Solution: 方法一:"Python语言程序设计"(中国大学MOOC平台)的答案 分析:对比两种指标,将共性(相同的区间)和异性(不同的区间)细分.这样两种指标的判断条件(不 ...