1. 程式人生 > 其它 >四、C#簡單操作MinIO

四、C#簡單操作MinIO

MinIO的官方網站非常詳細,以下只是本人學習過程的整理

Healper類

using Minio;
using Minio.DataModel;
using Minio.Exceptions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TestMinIO
{
    public static class MinIO
    {
        
#region 操作儲存桶 /// <summary>建立儲存桶 /// 建立儲存桶 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="loc">可選引數</param> /// <returns></returns> public
async static Task<bool> MakeBucket(MinioClient minio, string bucketName, string loc = "us-east-1") { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) {
throw new Exception(string.Format("儲存桶[{0}]已存在", bucketName)); } else { await minio.MakeBucketAsync(bucketName, loc); flag = true; } } catch (Exception e) { throw new Exception(e.Message); } return flag; } /// <summary>列出所有的儲存桶 /// 列出所有的儲存桶 /// </summary> /// <param name="minio">連線例項</param> /// <returns></returns> public async static Task<Tuple<bool, Minio.DataModel.ListAllMyBucketsResult>> ListBuckets(MinioClient minio) { bool flag = false; var list = new Minio.DataModel.ListAllMyBucketsResult(); try { list = await minio.ListBucketsAsync(); flag = true; //foreach (var bucket in list.Buckets) //{ // Console.WriteLine($"{bucket.Name} {bucket.CreationDateDateTime}"); //} } catch (Exception e) { throw new Exception(e.Message); } return Tuple.Create(flag, list); } /// <summary>檢查儲存桶是否存在 /// 檢查儲存桶是否存在 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <returns></returns> public async static Task<bool> BucketExists(MinioClient minio, string bucketName) { bool flag = false; try { flag = await minio.BucketExistsAsync(bucketName); } catch (Exception e) { throw new Exception(e.Message); } return flag; } /// <summary>刪除一個儲存桶 /// 刪除一個儲存桶 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <returns></returns> public async static Task<bool> RemoveBucket(MinioClient minio, string bucketName) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { await minio.RemoveBucketAsync(bucketName); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (Exception e) { throw new Exception(e.Message); } return flag; } /// <summary>列出儲存桶裡的物件 /// 列出儲存桶裡的物件 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="prefix">物件的字首</param> /// <param name="recursive">true代表遞迴查詢,false代表類似資料夾查詢,以'/'分隔,不查子資料夾</param> public static Tuple<bool, IObservable<Item>> ListObjects(MinioClient minio, string bucketName, string prefix = null, bool recursive = true) { bool flag = false; IObservable<Item> observable = null; try { var found = minio.BucketExistsAsync(bucketName); if (found.Result) { observable = minio.ListObjectsAsync(bucketName, prefix, recursive); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } //IDisposable subscription = observable.Subscribe( // item => Console.WriteLine($"Object: {item.Key}"), // ex => Console.WriteLine($"OnError: {ex}"), // () => Console.WriteLine($"Listed all objects in bucket {bucketName}\n")); } catch (Exception e) { throw new Exception(e.Message); } return Tuple.Create(flag, observable); } /// <summary>列出儲存桶中未完整上傳的物件 /// 列出儲存桶中未完整上傳的物件 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="prefix">物件的字首</param> /// <param name="recursive">true代表遞迴查詢,false代表類似資料夾查詢,以'/'分隔,不查子資料夾</param> /// <returns></returns> public static Tuple<bool, IObservable<Upload>> ListIncompleteUploads(MinioClient minio, string bucketName, string prefix = null, bool recursive = true) { bool flag = false; IObservable<Upload> observable = null; try { var found = minio.BucketExistsAsync(bucketName); if (found.Result) { observable = minio.ListIncompleteUploads(bucketName, prefix, recursive); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } //IDisposable subscription = observable.Subscribe( // item => Console.WriteLine($"OnNext: {item.Key}"), // ex => Console.WriteLine($"OnError: {ex.Message}"), // () => Console.WriteLine($"Listed the pending uploads to bucket {bucketName}")); } catch (Exception e) { throw new Exception(e.Message); } return Tuple.Create(flag, observable); } #endregion #region 儲存桶策略 /// <summary>獲取儲存桶或者物件字首的訪問許可權 /// 獲取儲存桶或者物件字首的訪問許可權 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <returns></returns> public async static Task<Tuple<bool,string>> GetPolicy(MinioClient minio, string bucketName) { bool flag = false; string policyJson = string.Empty; try { var found = minio.BucketExistsAsync(bucketName); if (found.Result) { policyJson = await minio.GetPolicyAsync(bucketName); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (Exception e) { throw new Exception(e.Message); } return Tuple.Create(flag, policyJson); } /// <summary>針對儲存桶和物件字首設定訪問策略 /// 針對儲存桶和物件字首設定訪問策略 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <returns></returns> public async static Task<bool> SetPolicy(MinioClient minio, string bucketName) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { string policyJson = $@"{{""Version"":""2012-10-17"",""Statement"":[{{""Action"":[""s3:GetBucketLocation""],""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}""],""Sid"":""""}},{{""Action"":[""s3:ListBucket""],""Condition"":{{""StringEquals"":{{""s3:prefix"":[""foo"",""prefix/""]}}}},""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}""],""Sid"":""""}},{{""Action"":[""s3:GetObject""],""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Resource"":[""arn:aws:s3:::{bucketName}/foo*"",""arn:aws:s3:::{bucketName}/prefix/*""],""Sid"":""""}}]}}"; await minio.SetPolicyAsync(bucketName, policyJson); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (Exception e) { throw new Exception(e.Message); } return flag; } #endregion #region 儲存桶通知 /// <summary>獲取儲存桶的通知配置 /// 獲取儲存桶的通知配置 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <returns></returns> private async static Task<Tuple<bool,string>> GetBucketNotification(MinioClient minio, string bucketName) { bool flag = false; string Ret = string.Empty; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { BucketNotification notifications = await minio.GetBucketNotificationsAsync(bucketName); Ret = notifications.ToXML(); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return Tuple.Create(flag, Ret); } /// <summary>給儲存桶設定通知 /// 給儲存桶設定通知 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <returns></returns> private async static Task<bool> SetBucketNotification(MinioClient minio, string bucketName) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { BucketNotification notification = new BucketNotification(); Arn topicArn = new Arn("aws", "sns", "us-west-1", "412334153608", "topicminio"); TopicConfig topicConfiguration = new TopicConfig(topicArn); List<EventType> events = new List<EventType>() { EventType.ObjectCreatedPut, EventType.ObjectCreatedCopy }; topicConfiguration.AddEvents(events); topicConfiguration.AddFilterPrefix("images"); topicConfiguration.AddFilterSuffix("jpg"); notification.AddTopic(topicConfiguration); QueueConfig queueConfiguration = new QueueConfig("arn:aws:sqs:us-west-1:482314153608:testminioqueue1"); queueConfiguration.AddEvents(new List<EventType>() { EventType.ObjectCreatedCompleteMultipartUpload }); notification.AddQueue(queueConfiguration); await minio.SetBucketNotificationsAsync(bucketName, notification); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>刪除儲存桶上所有配置的通知 /// 刪除儲存桶上所有配置的通知 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <returns></returns> private async static Task<bool> RemoveAllBucketNotifications(MinioClient minio, string bucketName) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { await minio.RemoveAllBucketNotificationsAsync(bucketName); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } #endregion #region 操作檔案物件 /// <summary> /// 從桶下載檔案到本地 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="fileName">本地路徑</param> /// <param name="sse"></param> /// <returns></returns> public async static Task<bool> FGetObject(MinioClient minio, string bucketName, string objectName, string fileName, ServerSideEncryption sse = null) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { if (File.Exists(fileName)) { File.Delete(fileName); } await minio.GetObjectAsync(bucketName, objectName, fileName, sse).ConfigureAwait(false); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>上傳本地檔案至儲存桶 /// 上傳本地檔案至儲存桶 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="fileName">本地路徑</param> /// <returns></returns> public async static Task<bool> FPutObject(MinioClient minio, string bucketName, string objectName, string fileName) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { await minio.PutObjectAsync(bucketName, objectName, fileName, contentType: "application/octet-stream"); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } #endregion #region Presigned操作 /// <summary>生成一個給HTTP GET請求用的presigned URL。瀏覽器/移動端的客戶端可以用這個URL進行下載,即使其所在的儲存桶是私有的。這個presigned URL可以設定一個失效時間,預設值是7天。 /// 生成一個給HTTP GET請求用的presigned URL。瀏覽器/移動端的客戶端可以用這個URL進行下載,即使其所在的儲存桶是私有的。這個presigned URL可以設定一個失效時間,預設值是7天。 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="expiresInt">失效時間(以秒為單位),預設是7天,不得大於七天</param> /// <param name="reqParams">額外的響應頭資訊,支援response-expires、response-content-type、response-cache-control、response-content-disposition</param> /// <returns></returns> public async static Task<Tuple<bool, string>> PresignedGetObject(MinioClient minio, string bucketName, string objectName, int expiresInt = 1000) { bool flag = false; string Ret = string.Empty; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { var reqParams = new Dictionary<string, string> { { "response-content-type", "application/json" } }; string presignedUrl = await minio.PresignedGetObjectAsync(bucketName, objectName, expiresInt, reqParams); Ret = presignedUrl; flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (Exception e) { throw new Exception(e.Message); } return Tuple.Create(flag, Ret); } /// <summary>生成一個給HTTP PUT請求用的presigned URL。瀏覽器/移動端的客戶端可以用這個URL進行上傳,即使其所在的儲存桶是私有的。這個presigned URL可以設定一個失效時間,預設值是7天。 /// 生成一個給HTTP PUT請求用的presigned URL。瀏覽器/移動端的客戶端可以用這個URL進行上傳,即使其所在的儲存桶是私有的。這個presigned URL可以設定一個失效時間,預設值是7天。 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="expiresInt">失效時間(以秒為單位),預設是7天,不得大於七天</param> /// <returns></returns> public async static Task<Tuple<bool, string>> PresignedPutObject(MinioClient minio, string bucketName, string objectName, int expiresInt = 1000) { bool flag = false; string Ret = string.Empty; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { string presignedUrl = await minio.PresignedPutObjectAsync(bucketName, objectName, expiresInt); Ret = presignedUrl; flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (Exception e) { throw new Exception(e.Message); } return Tuple.Create(flag, Ret); } /// <summary>允許給POST請求的presigned URL設定策略,比如接收物件上傳的儲存桶名稱的策略,key名稱字首,過期策略。 /// 允許給POST請求的presigned URL設定策略,比如接收物件上傳的儲存桶名稱的策略,key名稱字首,過期策略。 /// </summary> /// <param name="minio">連線例項</param> /// <param name="PostPolicy">物件的post策略</param> /// <returns></returns> public async static Task<Tuple<bool, string, Dictionary<string, string>>> PresignedPostPolicy(MinioClient minio) { bool flag = false; Tuple<string, Dictionary<string, string>> tdic = null; try { PostPolicy form = new PostPolicy(); DateTime expiration = DateTime.UtcNow; form.SetExpires(expiration.AddDays(10)); form.SetKey("my-objectname"); form.SetBucket("my-bucketname"); Tuple<string, Dictionary<string, string>> tuple = await minio.PresignedPostPolicyAsync(form); tdic = tuple; flag = true; //string curlCommand = "curl -X POST "; //foreach (KeyValuePair<string, string> pair in tuple.Item2) //{ // curlCommand = curlCommand + $" -F {pair.Key}={pair.Value}"; //} //curlCommand = curlCommand + " -F file=@/etc/bashrc " + tuple.Item1; // https://s3.amazonaws.com/my-bucketname"; } catch (Exception e) { throw new Exception(e.Message); } return Tuple.Create(flag, tdic.Item1, tdic.Item2); } #endregion #region 操作物件 /// <summary>返回物件資料的流 /// 返回物件資料的流 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="callback">處理流的回撥函式</param> /// <returns></returns> public async static Task<bool> GetObjectAsync(MinioClient minio, string bucketName, string objectName, Action<Stream> callback) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { await minio.StatObjectAsync(bucketName, objectName); await minio.GetObjectAsync(bucketName, objectName, callback); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>下載物件指定區域的位元組陣列做為流。offset和length都必須傳 /// 下載物件指定區域的位元組陣列做為流。offset和length都必須傳 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="offset">offset 是起始位元組的位置</param> /// <param name="length">length是要讀取的長度</param> /// <param name="callback">處理流的回撥函式</param> /// <returns></returns> public async static Task<bool> GetObjectAsync(MinioClient minio, string bucketName, string objectName, long offset, long length, Action<Stream> callback) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { await minio.StatObjectAsync(bucketName, objectName); await minio.GetObjectAsync(bucketName, objectName, offset, length, callback); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>下載並將檔案儲存到本地檔案系統 /// 下載並將檔案儲存到本地檔案系統 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="fileName">本地檔案路徑</param> /// <returns></returns> public async static Task<bool> GetObjectAsync(MinioClient minio, string bucketName, string objectName, string fileName) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { if (File.Exists(fileName)) { File.Delete(fileName); } await minio.StatObjectAsync(bucketName, objectName); await minio.GetObjectAsync(bucketName, objectName, fileName); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>通過檔案上傳到物件中 /// 通過檔案上傳到物件中 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="filePath">要上傳的本地檔名</param> /// <param name="contentType">檔案的Content type,預設是"application/octet-stream"</param> /// <param name="metaData">元資料頭資訊的Dictionary物件,預設是null</param> /// <returns></returns> public async static Task<bool> PutObjectAsync(MinioClient minio, string bucketName, string objectName, string filePath, string contentType = "application/octet-stream", Dictionary<string, string> metaData = null) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { await minio.PutObjectAsync(bucketName, objectName, filePath, contentType, metaData); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (Exception e) { throw new Exception(e.Message); } return flag; } /// <summary>通過Stream上傳物件 /// 通過Stream上傳物件 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <param name="data">要上傳的Stream物件</param> /// <param name="size">流的大小</param> /// <param name="contentType">檔案的Content type,預設是"application/octet-stream"</param> /// <param name="metaData">元資料頭資訊的Dictionary物件,預設是null</param> /// <returns></returns> public async static Task<bool> PutObjectAsync(MinioClient minio, string bucketName, string objectName, Stream data, long size, string contentType = "application/octet-stream", Dictionary<string, string> metaData = null) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { //byte[] bs = File.ReadAllBytes(fileName); //System.IO.MemoryStream filestream = new System.IO.MemoryStream(bs); await minio.PutObjectAsync(bucketName, objectName, data, size, contentType, metaData); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>獲取物件的元資料 /// 獲取物件的元資料 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <returns></returns> public async static Task<bool> StatObject(MinioClient minio, string bucketName, string bucketObject) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { ObjectStat statObject = await minio.StatObjectAsync(bucketName, bucketObject); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>從objectName指定的物件中將資料拷貝到destObjectName指定的物件 /// 從objectName指定的物件中將資料拷貝到destObjectName指定的物件 /// </summary> /// <param name="minio"></param> /// <param name="fromBucketName">源儲存桶名稱</param> /// <param name="fromObjectName">源儲存桶中的源物件名稱</param> /// <param name="destBucketName">目標儲存桶名稱</param> /// <param name="destObjectName">要建立的目標物件名稱,如果為空,預設為源物件名稱</param> /// <param name="copyConditions">拷貝操作的一些條件Map</param> /// <param name="sseSrc"></param> /// <param name="sseDest"></param> /// <returns></returns> public async static Task<bool> CopyObject(MinioClient minio, string fromBucketName, string fromObjectName, string destBucketName, string destObjectName, CopyConditions copyConditions = null, ServerSideEncryption sseSrc = null, ServerSideEncryption sseDest = null) { bool flag = false; try { bool found = await minio.BucketExistsAsync(fromBucketName); if (!found) { throw new Exception(string.Format("源儲存桶[{0}]不存在", fromBucketName)); } bool foundtwo = await minio.BucketExistsAsync(destBucketName); if (!foundtwo) { throw new Exception(string.Format("目標儲存桶[{0}]不存在", destBucketName)); } await minio.CopyObjectAsync(fromBucketName, fromObjectName, destBucketName, destObjectName, copyConditions, null, sseSrc, sseDest); flag = true; } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>刪除一個物件 /// 刪除一個物件 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <returns></returns> public async static Task<bool> RemoveObject(MinioClient minio, string bucketName, string objectName) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { await minio.RemoveObjectAsync(bucketName, objectName); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>刪除多個物件 /// 刪除多個物件 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectsList">含有多個物件名稱的IEnumerable</param> /// <returns></returns> public static async Task<bool> RemoveObjects(MinioClient minio, string bucketName, List<string> objectsList) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { if (objectsList != null) { IObservable<DeleteError> objectsOservable = await minio.RemoveObjectAsync(bucketName, objectsList).ConfigureAwait(false); flag = true; //IDisposable objectsSubscription = objectsOservable.Subscribe( // objDeleteError => Console.WriteLine($"Object: {objDeleteError.Key}"), // ex => Console.WriteLine($"OnError: {ex}"), // () => // { // Console.WriteLine($"Removed objects in list from {bucketName}\n"); // }); //return; } } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } /// <summary>刪除一個未完整上傳的物件 /// 刪除一個未完整上傳的物件 /// </summary> /// <param name="minio">連線例項</param> /// <param name="bucketName">儲存桶名稱</param> /// <param name="objectName">儲存桶裡的物件名稱</param> /// <returns></returns> public async static Task<bool> RemoveIncompleteUpload(MinioClient minio, string bucketName, string objectName) { bool flag = false; try { bool found = await minio.BucketExistsAsync(bucketName); if (found) { await minio.RemoveIncompleteUploadAsync(bucketName, objectName); flag = true; } else { throw new Exception(string.Format("儲存桶[{0}]不存在", bucketName)); } } catch (MinioException e) { throw new Exception(e.Message); } return flag; } #endregion } }
View Code

列舉類

using System;
using System.Collections.Generic;
using System.Text;

namespace TestMinIO
{
    /// <summary>ContentType列舉類
    /// ContentType列舉類
    /// </summary>
    public enum Content_Type
    {
        bmp,
        biz,
        exe,
        gif,
        html,
        ico,
        img,
        jpe,
        jpeg,
        jpg,
        movie,
        mp3,
        mp4,
        pdf,
        png,
        ppt,
        txt,
        xls,
        xsl,
        apk
    }

    /// <summary>ContentType列舉幫助類
    /// ContentType列舉幫助類
    /// </summary>
    public static class Helper
    {
        /// <summary>
        /// 根據列舉返回ContentType
        /// </summary>
        /// <param name="type">列舉型別</param>
        /// <returns></returns>
        public static string DoContentType(Content_Type type)
        {
            string Result = "application/octet-stream";
            switch (type)
            {
                case Content_Type.bmp:
                    Result = "application/x-bmp";
                    break;
                case Content_Type.biz:
                    Result = "text/xml";
                    break;
                case Content_Type.exe:
                    Result = "application/x-msdownload";
                    break;
                case Content_Type.gif:
                    Result = "image/gif";
                    break;
                case Content_Type.html:
                    Result = "text/html";
                    break;
                case Content_Type.ico:
                    Result = "image/x-icon";
                    break;
                case Content_Type.img:
                    Result = "application/x-img";
                    break;
                case Content_Type.jpe:
                    Result = "image/jpeg";
                    break;
                case Content_Type.jpeg:
                    Result = "image/jpeg";
                    break;
                case Content_Type.jpg:
                    Result = "image/jpeg";
                    break;
                case Content_Type.movie:
                    Result = "video/x-sgi-movie";
                    break;
                case Content_Type.mp3:
                    Result = "audio/mp3";
                    break;
                case Content_Type.mp4:
                    Result = "video/mpeg4";
                    break;
                case Content_Type.pdf:
                    Result = "application/pdf";
                    break;
                case Content_Type.png:
                    Result = "image/png";
                    break;
                case Content_Type.ppt:
                    Result = "application/x-ppt";
                    break;
                case Content_Type.txt:
                    Result = "text/plain";
                    break;
                case Content_Type.xls:
                    Result = "application/x-xls";
                    break;
                case Content_Type.xsl:
                    Result = "text/xml";
                    break;
                case Content_Type.apk:
                    Result = "application/vnd.android.package-archive";
                    break;
            }
            return Result;
        }
    }
}
View Code

呼叫方法很簡單,此處就不展示啦