C# 簡單使用Minio


一、安裝部署

1、下載安裝包:MinIO | 高性能,對Kubernetes友好的對象存儲

2、放到磁盤中,后面會以這個文件進行服務器安裝

3、磁盤新建一個目錄用於存放上傳文件,比如我創建的為:Data

 

 

 

 

4、運行控制台程序:切換到安裝包所在目錄(后面部分為存儲路徑), 輸入命令:minio.exe server D:\\Data

 

 

 

 5、打開瀏覽器,訪問:http://127.0.0.1:9000 用戶名和密碼默認為:minioadmin,主界面如下

 

 二、注冊成window服務

1. 下載winsw,下載地址:https://github.com/winsw/winsw/releases

 

 2. 將WinSW-net461.exe復制到自定義的目錄,並重命名為自己想命名的服務名稱minio-server.exe

 3. 同目錄下創建minio-server.xml。特別注意,xml和exe必須同名

 4. 配置minio-server.xml文件

 5. 使用minio-server.exe install安裝服務

安裝服務命令:minio-server.exe install

啟動服務命令:minio-server.exe start

停止服務命令:minio-server.exe stop

移除服務命令:sc delete minio-server

xml配置文件如下:

<service>
    <id>minio-server</id>
    <name>minio-server</name>
    <description>minio文件存儲服務器</description>
    <!-- 可設置環境變量 -->
    <env name="HOME" value="%BASE%"/>
    <executable>%BASE%\minio.exe</executable>
    <arguments>server "%BASE%\data"</arguments>
    <!-- <logmode>rotate</logmode> -->
    <logpath>%BASE%\logs</logpath>
    <log mode="roll-by-size-time">
      <sizeThreshold>10240</sizeThreshold>
      <pattern>yyyyMMdd</pattern>
      <autoRollAtTime>00:00:00</autoRollAtTime>
      <zipOlderThanNumDays>5</zipOlderThanNumDays>
      <zipDateFormat>yyyyMMdd</zipDateFormat>
    </log>
</service>
View Code

三、C#文件上傳下載

public async void testupload()
        {
            try
            {
                MinioClient minio = new MinioClient("127.0.0.1:9000", "minioadmin", "minioadmin");
                //桶名稱
                string buckName = "202110001";
                //判斷桶是否存在,如果不存在則創建桶,否則上傳文件會異常
                var exists = await MinioHelper.BucketExists(minio, buckName);
                if (!exists)
                {
                    //創建桶
                    await MinioHelper.MakeBucket(minio, buckName);
                }
                //上傳文件(桶下面可以自定義文件夾。如:1027/20211027001.jpg 則會創建一個1027文件夾)
                var result = await MinioHelper.FPutObject(minio, buckName, "1027/20211027001.png", "E:\\202110271417.png");
                //下載文件地址:192.168.90.128:9000+桶名稱+文件名稱
            }
            catch (Exception ex)
            {
                string str = ex.Message;
            }
        }
View Code

 

minio文件操作幫助類

public class MinioHelper
    {

        #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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM