using Aliyun.OSS; using ReleaseHelper.Models; using ReleaseHelper.Utils; using System; using System.IO; using System.Text.RegularExpressions; namespace ReleaseHelper.Services { public static class AliyunOss { public delegate void DeleWriteLog(string txt); public static DeleWriteLog WriteLog; private static OssClient client = null; private static AliyunAccessModel accessModel = null; /// /// 客户端锁 /// private readonly static object ClientLock = new object(); //public static string EndPoint { get; set; } //public static string AccessKeyId { get; set; } //public static string AccessKeySecret { get; set; } /// /// 授权有效期临界值 /// private const int EXP_THRESHOLD = 60 * 2 * 1000; public static AliyunAccessModel Access { get { lock (ClientLock) { if (accessModel == null || accessModel.Expiration - EXP_THRESHOLD < Functions.GetTimeStamp()) { //lock (accessModel) //{ accessModel = Api.GetAliyunAccess().Result; accessModel.Expiration = Functions.GetTimeStamp() + accessModel.Expiration * 1000; accessModel.EndPoint = Regex.Replace(accessModel.EndPoint, @"-internal", "", RegexOptions.IgnoreCase); //} } } return accessModel; } } public static void ClearAccess() { lock (ClientLock) { accessModel = null; } } private static bool AccessAvalible() { return !string.IsNullOrEmpty(Access?.EndPoint) && !string.IsNullOrEmpty(Access?.AccessKeyId) && !string.IsNullOrEmpty(Access?.AccessKeySecret); } private static OssClient Client { get { if (client == null && AccessAvalible()) { client = new OssClient(Access?.EndPoint, Access?.AccessKeyId, Access?.AccessKeySecret); } return client; } } /// /// 上传 /// /// /// /// /// public static bool SimpleUpload(string objectName, MemoryStream requestContent) { //// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。 //var endpoint = "yourEndpoint"; //// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。 //var accessKeyId = "yourAccessKeyId"; //var accessKeySecret = "yourAccessKeySecret"; //// 填写Bucket名称。 //var bucketName = "examplebucket"; //// 填写Object完整路径。Object完整路径中不能包含Bucket名称。 //var objectName = "exampleobject.txt"; //// 填写字符串。 //var objectContent = "More than just cloud."; // 创建OssClient实例。 //var client = new OssClient(endpoint, accessKeyId, accessKeySecret); bool res = false; try { //byte[] binaryData = Encoding.ASCII.GetBytes(objectContent); //MemoryStream requestContent = new MemoryStream(binaryData); // 上传文件。 Client?.PutObject(Access?.BucketName, objectName, requestContent); //Console.WriteLine("Put object succeeded"); res = true; } catch (Exception ex) { WriteLog?.Invoke($"Put object failed, {ex.Message}"); WriteLog?.Invoke(ex.StackTrace); //Console.WriteLine("Put object failed, {0}", ex.Message); } return res; } /// /// 上传 /// /// /// /// /// public static bool SimpleUpload(string objectName, string localFilename) { bool res = false; //PutObjectResult r; try { //byte[] binaryData = Encoding.ASCII.GetBytes(objectContent); //MemoryStream requestContent = new MemoryStream(binaryData); for (int i = 0; i < 5; i++) { using (PutObjectResult r = Client?.PutObject(Access?.BucketName, objectName, localFilename)) { //r = t. if (r?.HttpStatusCode == System.Net.HttpStatusCode.OK) { //r?.Dispose(); res = true; break; } } } // 上传文件。 //Console.WriteLine("Put object succeeded"); } catch (Exception ex) { WriteLog?.Invoke($"Put object failed, {ex.Message}"); WriteLog?.Invoke(ex.StackTrace); //Console.WriteLine("Put object failed, {0}", ex.Message); } return res; } } }