using Aliyun.OSS; using DaJiaoYan.Models; using DaJiaoYan.Utils; using System; using System.IO; using System.Text.RegularExpressions; namespace DaJiaoYan.Services { public static class AliyunOss { private static AliyunOssClient client = null; /// /// 客户端锁 /// private readonly static object ClientLock = new object(); private static AliyunOssClient Client { get { if (client == null) { lock (ClientLock) { client = new AliyunOssClient(); } } return client; } } /// /// 上传 /// /// /// /// /// public static bool SimpleUpload(string objectName, MemoryStream requestContent) { return Client.SimpleUpload(objectName, requestContent); } /// /// 上传 /// /// /// /// /// public static bool SimpleUpload(string objectName, string localFilename) { return Client.SimpleUpload(objectName, localFilename); } } public class AliyunOssClient { 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(); /// /// 授权有效期临界值 /// private const int EXP_THRESHOLD = 60 * 2 * 1000; private readonly string token = null; public AliyunOssClient(string token = null) { this.token = token; } private AliyunAccessModel Access { get { lock (ClientLock) { if (accessModel == null || accessModel.Expiration - EXP_THRESHOLD < Functions.GetTimeStamp()) { //lock (accessModel) //{ accessModel = Api.GetAliyunAccess(token).Result; if (accessModel != null) { accessModel.Expiration = Functions.GetTimeStamp() + accessModel.Expiration * 1000; accessModel.EndPoint = Regex.Replace(accessModel.EndPoint, @"-internal", "", RegexOptions.IgnoreCase); } //} } } return accessModel; } } public bool AccessAvailable { get { return !string.IsNullOrEmpty(Access?.EndPoint) && !string.IsNullOrEmpty(Access?.AccessKeyId) && !string.IsNullOrEmpty(Access?.AccessKeySecret); } } private OssClient Client { get { if (client == null && AccessAvailable) { client = new OssClient(Access?.EndPoint, Access?.AccessKeyId, Access?.AccessKeySecret); } return client; } } /// /// 上传 /// /// /// /// /// public bool SimpleUpload(string objectName, Stream 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); res = true; } catch (Exception ex) { WriteLog?.Invoke($"Put object failed, {ex.Message}"); WriteLog?.Invoke(ex.StackTrace); } return res; } /// /// 上传 /// /// /// /// /// public 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) { res = true; break; } } } // 上传文件。 } catch (Exception ex) { WriteLog?.Invoke($"Put object failed, {ex.Message}"); WriteLog?.Invoke(ex.StackTrace); } return res; } } }