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

640?wx_fmt=png

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

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

640?wx_fmt=png

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

使用效果

640?wx_fmt=png

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

640?wx_fmt=png

More

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

Reference

  • https://www.jianshu.com/p/224954dadcaf

  • https://gitee.com/weihanli/storage

  • https://github.com/WeihanLi/ActivityReservation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java线程的6种状态

线程的概念&#xff0c;以及线程的创建方式&#xff0c;见我之前写的博文 本篇文章主要讲Java线程的6种状态 6种状态&#xff1a;初始状态&#xff08;new&#xff09; 、可运行状态&#xff08;Runnable&#xff09;、运行状态&#xff08;Running&#xff09;、阻塞状态&am…

.NET Core 微信小程序支付——(统一下单)

最近公司研发了几个电商小程序&#xff0c;还有一个核心的电商直播&#xff0c;只要是电商一般都会涉及到交易信息&#xff0c;离不开支付系统&#xff0c;这里我们统一实现小程序的支付流程&#xff08;与服务号实现步骤一样&#xff09;。目录1、开通小程序的支付能力2、商户…

用.NET写“算命”程序

前言“算命”&#xff0c;是一种迷信&#xff0c;我父亲那一辈却执迷不悟&#xff0c;有时深陷其中&#xff0c;有时为求一“上上签”&#xff0c;甚至不惜重金&#xff0c;向“天神”保佑。我曾看到过有些算命网站&#xff0c;可以根据人的生辰八字&#xff0c;来求得这个人一…

ASP.NET Core 3.0 迁移避坑指南

一.前言.NET Core 3.0将会在 .NET Conf 大会上正式发布&#xff0c;截止今日发布了9个预览版&#xff0c;改动也是不少&#xff0c;由于没有持续关注&#xff0c;今天将前面开源的动态WebApi项目迁移到.NET Core 3.0还花了不少时间踩坑&#xff0c;给大家分享一下我在迁移过程中…

打不死我的,终将使我强大!DevOps黑客马拉松参赛心得

&#xff08;IDCF DevOps黑客马拉松到底是个啥活动&#xff1f;&#xff09;长得丑活得久、长得帅也惹人爱&#xff01;大家好&#xff0c;我是刘威。隆正信息的业务架构师-花名逸云。非常荣幸可以参加在北京举办的第一届DevOps黑客马拉松比赛。黑客马拉松不是突然冒出来的&…

Java线程池面试题

1、什么是线程池 java.util.concurrent.Executors提供了一个 java.util.concurrent.Executor接口的实现用于创建线程池 多线程技术主要解决处理器单元内多个线程执行的问题&#xff0c;它可以显著减少处理器单元的闲置时间&#xff0c;增加处理器单元的吞吐能力。 假设一个服…

「标签管理」使用标签管理有道云笔记资料

因着大家对文件标签化比较高难道&#xff0c;需要熟悉一个标签工具软件&#xff0c;所以今天暂时来介绍个简单一些的网络资料的标签化管理&#xff0c;使用有道云笔记作为落地工具&#xff0c;同理在OneNote、印象笔记上原理类似。有道云笔记免费功能够用为了选择哪个笔记产品&…

我如何吸引Elastic创始人一起对高并发写入进行优化?

导语&#xff1a;在腾讯金融科技数据应用部的全民 BI 项目里&#xff0c;我们每天面对超过 10 亿级的数据写入&#xff0c;提高 ES 写入性能迫在眉睫&#xff0c;在最近的一次优化中&#xff0c;有幸参与到了 Elasticsearch 开源社区中。背景为了更便捷地分析数据&#xff0c;腾…

微软+开源,那些亲爱的以及热爱的

微软 Reactor 社区空间开幕式暨 Azure Meetup 社区活动已于9月7日在上海圆满结束&#xff01;但是…如何构建一个可持续发展的社区未来的路&#xff0c;仍然很长...你应该知道的微软 Reactor微软 Reactor 是微软为构建开发者社区而提供的一个社区空间&#xff0c;以“予力多元…

ASP.NET Core 2.2 项目升级至 3.0 备忘录

.NET Core 3.0及ASP.NET Core 3.0 前瞻ASP.NET Core 3.0 迁移避坑指南将 ASP.NET Core 2.2 迁移至 ASP.NET Core 3.0 需要注意的地方记录在这篇随笔中。TargetFramework 改为 netcoreapp3.0 <TargetFramework>netcoreapp3.0</TargetFramework>从 Web 项目&#xff…

Java 死锁

目录&#xff1a; 什么是死锁&#xff1f;死锁是怎么产生的&#xff1f;怎么排查死锁&#xff1f;死锁的预防拓展&#xff1a;Java CPU 100%排查 一 什么是死锁&#xff1f; 注&#xff1a;线程和进程都可能会产生死锁&#xff0c;以下以线程为例 死锁是指两个或两个以上的…

.NET Core 微信小程序退款——(统一退款)

点击上方“dotNET名人堂”&#xff0c;选择“设为星标”用学习的姿态&#xff0c;步入工作的状态继上一篇".NET Core 微信小程序支付——&#xff08;统一下单&#xff09;后"&#xff0c;本文将实现统一退款功能&#xff0c;能支付就应该能退款嘛&#xff0c;一般涉…

Mysql数据库锁机制

一&#xff1a;概念介绍 MySQL数据库锁管理机制&#xff1a; SQL层实现的锁机制    Meta-data元数据锁&#xff1a;在table cache缓存里实现的&#xff0c;为DDL&#xff08;Data Definition Language&#xff09;提供隔离操作。一种特别的meta-data元数据类型&#xff0c;…

干货|亲测有效的N倍学习效果笔记法

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「108」篇原创敬上大家好&#xff0c;我是Z哥。先祝大家中秋快乐。我猜你现在心情不错&#xff0c;毕竟小长假的第一天才开始&#xff0c;后面还有60个小时的假期&a…

.NET Core 3.0 可卸载程序集原理简析

文章转载授权级别&#xff1a;A 预计阅读时间&#xff1a;8分钟 损失发量&#xff1a;不好统计因为最近在群里被问到如何理解 .NET Core 3.0 可卸载程序集&#xff0c;所以就写了这篇简单的分析。因为时间实在很少&#xff0c;这篇文章只简单的罗列了相关的代码&…

.NetCore技术研究-ConfigurationManager在单元测试下的坑

最近在将原有代码迁移.NET Core, 代码的迁移基本很快&#xff0c;当然也遇到了不少坑&#xff0c;重构了不少&#xff0c;后续逐步总结分享给大家。今天总结分享一下ConfigurationManager遇到的一个问题。先说一下场景&#xff1a;迁移.NET Core后&#xff0c;已有的配置文件&a…

分析一次double强转float的翻车原因

人逢喜事精神爽,总算熬到下班撩~~正准备和同事打个招呼回家,被同事拖住问了.?‍♂️: 你们组做的那块代码,把double类型数据成float有问题啊?.?‍♀️: 嗯?不对是正常啊,float精度是没有double高,但float能保存到小数点后好多位,对我们来说完全够用了!?‍♂️: 不是啊,这不…

.NET Core 3.0之深入源码理解Host(二)

写在前面停了近一个月的技术博客&#xff0c;随着正式脱离996的魔窟&#xff0c;接下来也正式恢复了。本文从源码角度进一步讨论.NET Core 3.0 中关于Host扩展的一些技术点&#xff0c;主要内容是关于创建Long Run Program的创建与守护。关于Host&#xff0c;我们最容易想到的就…

dotNET Core实现分布式环境下的流水号唯一

业务背景在管理系统中&#xff0c;很多功能模块都会涉及到各种类型的编号&#xff0c;例如&#xff1a;流程编号、订单号、合同编号等等。编号各有各自的规则&#xff0c;但通常有一个流水号来确定编号的唯一性&#xff0c;保证流水号的唯一&#xff0c;在不同的环境中实现方式…

认证方案之初步认识JWT

前言&#xff1a;现在越来越多的项目或多或少会用到JWT&#xff0c;为什么会出现使用JWT这样的场景的呢&#xff1f;假设现在有一个APP&#xff0c;后台是分布式系统。APP的首页模块部署在上海机房的服务器上&#xff0c;子页面模块部署在深圳机房的服务器上。此时你从首页登录…