gitee怎么仓库间传文件_实现一个简单的基于码云(Gitee) 的 Storage
實(shí)現(xiàn)一個簡單的基于碼云(Gitee) 的 Storage
Intro
上次在 asp.net core 從單機(jī)到集群 一文中提到存儲還不支持分布式,并立了一個 flag
基于 github 或者 開源中國的碼云實(shí)現(xiàn)一個 storage
于是這兩天就來填坑了。。
實(shí)現(xiàn)了一個簡單的基于開源中國的碼云的 storage
準(zhǔn)備工作
碼云官方有 API 接口列表 https://gitee.com/api/v5/swagger
上傳文件API:https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoContentsPath
新建一個倉庫來存我們要保存的文件,新建的時候分支模型選擇默認(rèn)的單分支模型即可,只要master分支即可 ,最好直接創(chuàng)建 readme 或者新加一個文件以創(chuàng)建分支:
然后需要創(chuàng)建一個 accessToken,在 設(shè)置里的私人令牌配置中新建一個token,需要 projects 權(quán)限
Storage 簡單實(shí)現(xiàn)
參考上面 Gitee 提供的 API 接口,自己實(shí)現(xiàn)了一個簡單的 GiteeStorageProvider ,Github 完整源碼:https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.Common/StorageProvider.cs
///
/// 碼云存儲
///
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 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; }
}
服務(wù)注冊,這里用了 HttpClientFactory 來使用 HttpClient,個人比較喜歡用強(qiáng)類型的 HttpClient,如果喜歡使用通過 IHttpClientFactory 來顯示創(chuàng)建,也可以注入一個 IHttpClientFactory ,在內(nèi)部創(chuàng)建 HttpClient
services.Configure<GiteeStorageOptions>(Configuration.GetSection("Storage:Gitee"));
services.AddHttpClient<IStorageProvider, GiteeStorageProvider>();
services.TryAddSingleton<IStorageProvider, GiteeStorageProvider>();
配置示例:
{
"Storage":{
"Gitee":{
"UserName": "weihanli",
"RepositoryName": "storage",
"AccessToken": "xxx"
}
}
}
使用效果
可以看到上傳的圖片已經(jīng)上傳到我們新建的倉庫了,到倉庫里看一下:
More
只實(shí)現(xiàn)了上傳,本來想也加一個列出某個目錄下的所有文件及子目錄,但是看好像沒有接口,如果要實(shí)現(xiàn)的話,可能只能基于 git 去實(shí)現(xiàn),從 git 信息里獲取,暫時不怎么用到,先不管了,暫時擱置吧,
Reference
https://www.jianshu.com/p/224954dadcaf
https://gitee.com/weihanli/storage
https://github.com/WeihanLi/ActivityReservation
總結(jié)
以上是生活随笔為你收集整理的gitee怎么仓库间传文件_实现一个简单的基于码云(Gitee) 的 Storage的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 压倒机械硬盘的最后一根稻草 微软痛下杀手
- 下一篇: Intel回应冻结PC芯片部门招聘:只为