MinIO 介紹
MinIO 是一個基於 Apache License v2.0 開源協議的對象存儲服務。它兼容亞馬遜 S3 雲存儲服務接口,非常適合於存儲大容量非結構化的數據,例如圖片、視頻、日志文件、備份數據和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾 kb 到最大 5T 不等。
MinIO 安裝
MinIO 的官方文檔提供了相當全面的安裝信息,使用 docker 安裝 MinIO,不考慮 MinIO 的分布式,畢竟對外使用來講,MinIO 更像是個黑盒子,只關心與黑盒子的上傳下載操作,而不關心是單機存儲還是分布式存儲。
Docker 中創建並運行 MinIO
docker run -p 9800:9000 --name minioservice \
-e "MINIO_ACCESS_KEY=AKIAIOSFODNN7EXAMPLE" \
-e "MINIO_SECRET_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" \
-v /mnt/data:/data \
-v /mnt/config:/root/.minio \
minio/minio server /data
依據 MinIO Docker 快速入門,下載 MinIO 鏡像並創建一個 MinIO 容器。
https://docs.min.io/cn/minio-docker-quickstart-guide.html
參數說明:
- -p:對外端口可以依據使用自定義配置,對內端口保持 9000 就行,因本地使用了 portainer,占用了 9000 的對外端口,因此更換使用 9800 端口。(MinIO 文檔中使用的是 9000 的)
- -e:設置 Access 和 Secret 密鑰,創建時不填寫這兩個則采用默認的,Access 和 Secret 都是 minioadmin,登錄進去后再頁面中再去更改。
- -v:設置數據卷用來保存存儲應用數據和配置信息。(如果只是想嘗試下 MinIO,不用數據卷就行,這樣在容器退出后數據會丟失)
訪問 MinIO 管理頁面
訪問服務器對外 IP 及 MinIO 容器使用的對外端口,MinIO 提供的登錄頁面相當簡潔,很 nice.使用創建容器時填寫的 Access 和 Secret 或是默認的 minioadmin 登錄。
創建 Bucket
- 創建 Bucket,Bucket 釋義是一個容器,用來裝載基本的存儲文件、存儲對象的空間,需要在上傳文件前先建立一個。右下角點擊加號,選擇創建 bucket。
- 選擇一個 Bucket,可修改該存儲空間的訪問策略或是刪除存儲空間
文件上傳與下載
- 選擇左側的 Bucket,頁面右下角點擊上傳文件
- 左側選擇 Bucket,右側列表中操作文件,分享、預覽、下載和刪除文件
- 文件分享時配置鏈接時效,最大 7 天
MinIO 應用
不考慮項目搭建問題,假設項目已經准備好。對於.Net 與 MinIO 的交互,MinIO 提供了齊全的 Api 與 Nuget 包,可以參照 MinIO 中的文檔,提供了相當齊全的接口。
安裝 MinIO Nuget 包
官方已經提供了基於.Net Standard的Nuget 包安裝到項目中即可。
Install-Package Minio
上傳文件
class Program
{
static void Main(string[] args)
{
var endpoint = "xxx.xxx.xxx.xxx:9800";
var accessKey = "你的accesskey";
var secretKey = "你的secretKey";
try
{
var minio = new MinioClient(endpoint, accessKey, secretKey);
Run(minio).Wait();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
private async static Task Run(MinioClient minio)
{
var bucketName = "pngs";
var location = "us-east-1";
var objectName = "test.png";
var filePath = @"C:\Users\admin\Desktop\test.png";
var contentType = "image/png";
try
{
// 檢查是否存在bucket
bool found = await minio.BucketExistsAsync(bucketName);
if (!found)
{
// 創建bucket
await minio.MakeBucketAsync(bucketName, location);
}
// 上傳文件到bucket
await minio.PutObjectAsync(bucketName, objectName, filePath, contentType);
Console.WriteLine("Successfully uploaded " + objectName);
}
catch (MinioException e)
{
Console.WriteLine("File Upload Error: {0}", e.Message);
}
}
}
獲取 MinIO Bucket列表
var bucketList = await minio.ListBucketsAsync();
獲取 MinIO文件列表
var fileList= minio.ListObjectsAsync(bucketName);
獲取文件的Url地址
var bucketName = "pngs";//存儲空間名
var objectName = "test.png";//文件名
var expiresInt = 604800;//有效期秒數,最大7天(604800秒)
var fileUrl = await minio.PresignedGetObjectAsync(bucketName, objectName,expiresInt);
獲取到這個fileUrl可在瀏覽器中直接展示,對於圖片類型來講,有些場景下可以提供直接展示,如頭像之類的。
對於一些文件如報告文件,存儲包等,也可以拿着url直接下載了。從 MinIO 的單機服務中獲取文件,一定程度的降低了承載業務的應用程序壓力。
2020-10-19,望技術有成后能回來看見自己的腳步