Skip to content

OSS

约 464 字大约 2 分钟

NET

2023-12-05

internal class Config
    {
        public static string AccessKeyId = "";

        public static string AccessKeySecret = "";

        public static string bucketName = "";

        public static string Endpoint = "";

        public static string DirToDownload = "<your local dir to download file>";

        public static string FileToUpload = "<your local file to upload>";

        public static string BigFileToUpload = "<your local big file to upload>";
        public static string ImageFileToUpload = "<your local image file to upload>";
        public static string CallbackServer = "<your callback server uri>";
    }
    public class OSS
    {
        static OssClient client = new OssClient(Config.Endpoint, Config.AccessKeyId, Config.AccessKeySecret);

        /// <summary>
        /// 上传文件到oss
        /// </summary>
        /// <param name="key">上传保存的路径与文件名</param>
        /// <param name="filePath">本地要上传的文件的路径</param>
        public static bool PutFile(string key, string filePath, EventHandler<StreamTransferProgressArgs> streamProgressCallback)
        {
            try
            {
                using (var fs = File.Open(filePath, FileMode.Open))
                {
                    var putObjectRequest = new PutObjectRequest(Config.bucketName, key, fs);
                    putObjectRequest.StreamTransferProgress += streamProgressCallback;
                    PutObjectResult result = client.PutObject(putObjectRequest);
                    return result.HttpStatusCode == System.Net.HttpStatusCode.OK;
                }
               
            }
            catch (Exception ex) { Debug.WriteLine("-----------" + ex.Message); return false; }

        }


        public static void DownloadFile(string key, string savePath, out string errmsg, EventHandler<StreamTransferProgressArgs> streamProgressCallback)
        {
            errmsg = "";
            //client.PutObject(Config.bucketName, key, @"D:\" + key);
            try
            {
                var getObjectRequest = new GetObjectRequest(Config.bucketName, key);
                getObjectRequest.StreamTransferProgress += streamProgressCallback;
                var ossObject = client.GetObject(getObjectRequest);
                using (var stream = ossObject.Content)
                {
                    var buffer = new byte[1024 * 1024];
                    var bytesTotal = 0;
                    var bytesRead = 0;
                    using (FileStream fileStream = new FileStream(savePath, FileMode.Create))
                    {
                        while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            bytesTotal += bytesRead;
                            fileStream.Write(buffer, 0, bytesRead);
                        }
                    }
                }
                Log.Logger.Debug($"下载文件[{key}]\n 下载结果:{JSONHelper.EntityToJSON(ossObject)}");
                Console.WriteLine("Get object:{0} succeeded", key);
            }
            catch (Aliyun.OSS.Common.OssException ossex) { if (ossex.ErrorCode == "NoSuchKey") { errmsg = "下载的文件不存在!"; } }
            catch (Exception ex) { errmsg = ex.Message; Log.Logger.Debug($"下载文件{key}异常\n{ex.Message}\n{JSONHelper.EntityToJSON(ex.StackTrace)}"); }
        }


        private static void streamProgressCallback1(object sender, StreamTransferProgressArgs args)
        {
            Log.Logger.Debug($"进度 - 已传输:{args.TransferredBytes}/{args.TotalBytes}, 进度:{Math.Round((double)args.TransferredBytes / args.TotalBytes, 2) * 100}%, 递增:{args.IncrementTransferred}");
        }

        /// <summary>
        /// 删除多少天前的文件
        /// </summary>
        /// <param name="keyday"></param>
        public static void DeleteByDate(int keyday)
        {
            try
            {
                var keys = new List<string>();
                var listResult = client.ListObjects(Config.bucketName);

                foreach (var summary in listResult.ObjectSummaries)
                {
                    int day = (DateTime.Now - summary.LastModified).Days;
                    if (day > keyday) keys.Add(summary.Key);
                }
                Log.Logger.Debug($"删除文件 =>  OSS共 {listResult.ObjectSummaries.Count()} 个文件,删除超过 {keyday} 天的文件 {keys.Count} 个。\r\n{string.Join("、", keys)}");
                var request = new DeleteObjectsRequest(Config.bucketName, keys, false);
                DeleteObjectsResult deleteObjectsResult = client.DeleteObjects(request);
                Log.Logger.Debug($"删除结果:{JSONHelper.EntityToJSON(deleteObjectsResult)}");
            }
            catch (Exception ex) { }
        }

        /// <summary>
        /// 列出所有文件
        /// </summary>
        public static void ListFiles()
        {
            var result = client.ListObjects(Config.bucketName);

            Console.WriteLine("List files of bucket:{0} succeeded ", Config.bucketName);
            foreach (var summary in result.ObjectSummaries)
            {
                Debug.WriteLine($"{summary.Key} {summary.LastModified.ToString("f")} {summary.Size / 1024}kb ");
            }

        }

    }