C#結(jié)合Minio實(shí)現(xiàn)文件上傳存儲(chǔ)與更新
前言
MinIO是一個(gè)開(kāi)源的對(duì)象存儲(chǔ)服務(wù)器,專門設(shè)計(jì)用于在大規(guī)模數(shù)據(jù)存儲(chǔ)環(huán)境中運(yùn)行。它兼容Amazon S3 API,因此可以作為一個(gè)替代方案用于存儲(chǔ)和檢索數(shù)據(jù),特別是用于云存儲(chǔ)和分布式存儲(chǔ)場(chǎng)景。
MinIO的部署非常簡(jiǎn)單,在官網(wǎng)下載 Minio.exe,然后使用批處理命令即可部署,非常方便。
C:/Users/admin/Desktop/minio.exe server Z:/Minio/Data/
后面的 Z:/Minio/Data/ 代表Minio存儲(chǔ)的物理位置。
如果需要在C#中對(duì)Minio庫(kù)進(jìn)行操作,需要引入對(duì)應(yīng)的Minio庫(kù)。

官方的示例代碼在Github上已經(jīng)有了,建議在官網(wǎng)Example中查找對(duì)應(yīng)需要。
這里介紹幾個(gè)常用的Minio在C#中的操作方法
1.建立Minio鏈接實(shí)例
public bool getMinoConnection(string IP)
{
// "KW5xQbKfmJ787YLGescu", "ANB72EgBqNGTdTGKE8KOad0DbuJ1sZtGCLE81234" 192.168.50.196
// "2MX2wsBGWIklR9EFdamG", "1234T0oLarccqIqc7ef406KWhTT0EkqreaAzELtY" 192.168.10.211
try
{
if (IP == "192.168.50.196" || IP == "192.168.50.195")
{
minioClient = new MinioClient().WithEndpoint("192.168.50.196", 9000)
.WithCredentials("KW5xQbKfmJ787YLGescu", "ANB72EgBqNGTdTGKE8KOad0DbuJ1sZtGCLE81234")
.Build();
}
else if (IP == "192.168.10.211" || IP == "192.168.10.212")
{
minioClient = new MinioClient().WithEndpoint("192.168.10.211", 9000)
.WithCredentials("2MX2wsBGWIklR9EFdamG", "1234T0oLarccqIqc7ef406KWhTT0EkqreaAzELtY")
.Build();
}
}
catch (Exception ex)
{
Console.Out.WriteLine(ex.Message);
return false;
}
return true;
}
2.異步上傳文件
①.主要使用流的方式上傳文件,內(nèi)容以字符串為例
需要注意的是,如果上傳的文件對(duì)應(yīng)的MinioPath地址相同,則文件會(huì)直接覆蓋,達(dá)到更新的作用
public async Task<bool> UploaderAsync(string IP, string MinioPath, string result)
{
if (getMinoConnection(IP))
{
await Run(minioClient, MinioPath, result);
minioClient.Dispose();
return true;
}
return false;
}
private async Task Run(IMinioClient minio, string MinioPath,string result)
{
var bucketName = "imagestore";
var objectName = MinioPath;
var contentType = "application/text";
byte[] byteArray = Encoding.UTF8.GetBytes(result);
try
{
using (MemoryStream stream = new MemoryStream(byteArray))
{
stream.Position = 0;
// Upload a file to bucket.
var putObjectArgs = new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithObjectSize(stream.Length)
.WithStreamData(stream);
await minio.PutObjectAsync(putObjectArgs);
}
}
catch (MinioException e)
{
Console.WriteLine("File Upload Error: {0}", e.Message);
}
}
②.使用本地文件的方式上傳文件
private async Task Run(IMinioClient minio, string FolderName, string FileName, string BaseName)
{
var bucketName = "imagestore";
var objectName = FolderName + "/" + FileName;
var filePath = BaseName;
//var contentType = "application/jpg";
try
{
// Upload a file to bucket.
var putObjectArgs = new PutObjectArgs()
.WithBucket(bucketName)
.WithObject(objectName)
.WithFileName(filePath);
//.WithContentType(contentType);
await minio.PutObjectAsync(putObjectArgs) ;
minio.Dispose();
}
catch (MinioException e)
{
Console.WriteLine("File Upload Error: {0}", e.Message);
}
}
3.下載文件
我這里使用的http請(qǐng)求,你也可以按照官方庫(kù) GetObject去獲取
public async Task<BitmapImage> DoGetFile(string minioheader, int ImgNums, string Ppath)
{
var MinioPath = Ppath.Split('/')[2] + "/" + Ppath.Split('/')[3] + "/images/" + ImgNums.ToString() + "_output_image.jpg";
BitmapImage bitmapImage = new BitmapImage();
using (HttpClient client = new HttpClient())
{
try
{
HttpResponseMessage responseMessage = await client.GetAsync(minioheader + MinioPath);
responseMessage.EnsureSuccessStatusCode();
byte[] imageBytes = await responseMessage.Content.ReadAsByteArrayAsync();
using (MemoryStream memory = new MemoryStream(imageBytes))
{
bitmapImage.BeginInit();
bitmapImage.StreamSource = memory;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return bitmapImage;
}
差不多就這些
以上就是C#結(jié)合Minio實(shí)現(xiàn)文件上傳存儲(chǔ)與更新的詳細(xì)內(nèi)容,更多關(guān)于C# Minio文件上傳存儲(chǔ)與更新的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#?CefSharp?根據(jù)輸入日期段自動(dòng)選擇日期的操作代碼
這篇文章主要介紹了C#?CefSharp?根據(jù)輸入日期段自動(dòng)選擇日期的操作代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
在Winform框架界面中改變并存儲(chǔ)界面皮膚樣式的方法
下面小編就為大家分享一篇在Winform框架界面中改變并存儲(chǔ)界面皮膚樣式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11
C#基于TCP實(shí)現(xiàn)簡(jiǎn)單游戲客戶端的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于C#基于TCP實(shí)現(xiàn)簡(jiǎn)單游戲客戶端的相關(guān)資料,通過(guò)本文介紹的方法可以直接實(shí)現(xiàn)游戲客戶端,是個(gè)非常適合學(xué)習(xí)的實(shí)例需要的朋友可以參考下2021-11-11
Unity Shader實(shí)現(xiàn)黑幕過(guò)場(chǎng)效果
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)黑幕過(guò)場(chǎng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
C#托管堆對(duì)象實(shí)例包含內(nèi)容分析
這篇文章主要介紹了C#托管堆對(duì)象實(shí)例包含內(nèi)容,實(shí)例展示了托管對(duì)象的結(jié)構(gòu)及運(yùn)行原理,需要的朋友可以參考下2014-09-09
C#實(shí)現(xiàn)簡(jiǎn)單串口通訊實(shí)例
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)單串口通訊的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
基于C#技術(shù)實(shí)現(xiàn)身份證識(shí)別功能
這篇文章主要介紹了基于C#技術(shù)實(shí)現(xiàn)身份證識(shí)別功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07

