AliyunOss.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using Aliyun.OSS;
  2. using ReleaseHelper.Models;
  3. using ReleaseHelper.Utils;
  4. using System;
  5. using System.IO;
  6. using System.Text.RegularExpressions;
  7. namespace ReleaseHelper.Services
  8. {
  9. public static class AliyunOss
  10. {
  11. public delegate void DeleWriteLog(string txt);
  12. public static DeleWriteLog WriteLog;
  13. private static OssClient client = null;
  14. private static AliyunAccessModel accessModel = null;
  15. /// <summary>
  16. /// 客户端锁
  17. /// </summary>
  18. private readonly static object ClientLock = new object();
  19. //public static string EndPoint { get; set; }
  20. //public static string AccessKeyId { get; set; }
  21. //public static string AccessKeySecret { get; set; }
  22. /// <summary>
  23. /// 授权有效期临界值
  24. /// </summary>
  25. private const int EXP_THRESHOLD = 60 * 2 * 1000;
  26. public static AliyunAccessModel Access
  27. {
  28. get
  29. {
  30. lock (ClientLock)
  31. {
  32. if (accessModel == null || accessModel.Expiration - EXP_THRESHOLD < Functions.GetTimeStamp())
  33. {
  34. //lock (accessModel)
  35. //{
  36. accessModel = Api.GetAliyunAccess().Result;
  37. accessModel.Expiration = Functions.GetTimeStamp() + accessModel.Expiration * 1000;
  38. accessModel.EndPoint = Regex.Replace(accessModel.EndPoint, @"-internal", "", RegexOptions.IgnoreCase);
  39. //}
  40. }
  41. }
  42. return accessModel;
  43. }
  44. }
  45. public static void ClearAccess()
  46. {
  47. lock (ClientLock)
  48. {
  49. accessModel = null;
  50. }
  51. }
  52. private static bool AccessAvalible()
  53. {
  54. return !string.IsNullOrEmpty(Access?.EndPoint) && !string.IsNullOrEmpty(Access?.AccessKeyId) && !string.IsNullOrEmpty(Access?.AccessKeySecret);
  55. }
  56. private static OssClient Client
  57. {
  58. get
  59. {
  60. if (client == null && AccessAvalible())
  61. {
  62. client = new OssClient(Access?.EndPoint, Access?.AccessKeyId, Access?.AccessKeySecret);
  63. }
  64. return client;
  65. }
  66. }
  67. /// <summary>
  68. /// 上传
  69. /// </summary>
  70. /// <param name="bucketName"></param>
  71. /// <param name="objectName"></param>
  72. /// <param name="requestContent"></param>
  73. /// <returns></returns>
  74. public static bool SimpleUpload(string objectName, MemoryStream requestContent)
  75. {
  76. //// yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
  77. //var endpoint = "yourEndpoint";
  78. //// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  79. //var accessKeyId = "yourAccessKeyId";
  80. //var accessKeySecret = "yourAccessKeySecret";
  81. //// 填写Bucket名称。
  82. //var bucketName = "examplebucket";
  83. //// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
  84. //var objectName = "exampleobject.txt";
  85. //// 填写字符串。
  86. //var objectContent = "More than just cloud.";
  87. // 创建OssClient实例。
  88. //var client = new OssClient(endpoint, accessKeyId, accessKeySecret);
  89. bool res = false;
  90. try
  91. {
  92. //byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
  93. //MemoryStream requestContent = new MemoryStream(binaryData);
  94. // 上传文件。
  95. Client?.PutObject(Access?.BucketName, objectName, requestContent);
  96. //Console.WriteLine("Put object succeeded");
  97. res = true;
  98. }
  99. catch (Exception ex)
  100. {
  101. WriteLog?.Invoke($"Put object failed, {ex.Message}");
  102. WriteLog?.Invoke(ex.StackTrace);
  103. //Console.WriteLine("Put object failed, {0}", ex.Message);
  104. }
  105. return res;
  106. }
  107. /// <summary>
  108. /// 上传
  109. /// </summary>
  110. /// <param name="bucketName"></param>
  111. /// <param name="objectName"></param>
  112. /// <param name="localFilename"></param>
  113. /// <returns></returns>
  114. public static bool SimpleUpload(string objectName, string localFilename)
  115. {
  116. bool res = false;
  117. //PutObjectResult r;
  118. try
  119. {
  120. //byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
  121. //MemoryStream requestContent = new MemoryStream(binaryData);
  122. for (int i = 0; i < 5; i++)
  123. {
  124. using (PutObjectResult r = Client?.PutObject(Access?.BucketName, objectName, localFilename))
  125. {
  126. //r = t.
  127. if (r?.HttpStatusCode == System.Net.HttpStatusCode.OK)
  128. {
  129. //r?.Dispose();
  130. res = true;
  131. break;
  132. }
  133. }
  134. }
  135. // 上传文件。
  136. //Console.WriteLine("Put object succeeded");
  137. }
  138. catch (Exception ex)
  139. {
  140. WriteLog?.Invoke($"Put object failed, {ex.Message}");
  141. WriteLog?.Invoke(ex.StackTrace);
  142. //Console.WriteLine("Put object failed, {0}", ex.Message);
  143. }
  144. return res;
  145. }
  146. }
  147. }