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;
}
}
}