CosUploadHelper.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Net.Http;
  5. using System.Net.Http.Headers;
  6. using System.Security.Cryptography;
  7. using System.Text;
  8. using System.Web;
  9. using Vinno.vCloud.Common.Storage.ObjectStorageInfo;
  10. namespace Vinno.vCloud.Disk.Tencent
  11. {
  12. public class CosUploadHelper
  13. {
  14. private static TencentCosConfig _tencentCosConfig;
  15. public static void Init()
  16. {
  17. _tencentCosConfig = new TencentCosConfig("https://flyinsono-hk-1300984704.cos.ap-hongkong.myqcloud.com/", "AKIDMSIsADUUpvJGwJOKvsb5IDrGtGNBRzzi", "4sQhdJBl5HI7f3oLbZIlwqXOyILyLWP0");//Vinno
  18. //_tencentCosConfig = new TencentCosConfig("https://shanghai-1304323531.cos.ap-shanghai.myqcloud.com/", "AKIDF1C0g7VcfU6UirrB0ZN0QfgiYAaynG6g", "f9QVFpGaiqQ3ThARUKHQL1HI7j7QN8e3");//Loki上海节点
  19. //_tencentCosConfig = new TencentCosConfig("https://shanghai-1305757778.cos.ap-nanjing.myqcloud.com/", "AKIDVt3ye6KNDqGfotqfMxMWR7YnmW0EDvOc", "3rPimbCYtFlCVg2B5kAKFuPgiU4QXO0N");//Jeremy账号,测试节点
  20. }
  21. /// <summary>下载文件</summary>
  22. /// <param name="requestUrl">文件下载地址</param>
  23. /// <returns></returns>
  24. public static byte[] DownloadFile(string requestUrl)
  25. {
  26. return ObjectStorageSingle.Instance.GetFile(requestUrl);
  27. }
  28. /// <summary>上传文件</summary>
  29. /// <param name="fileData"></param>
  30. /// <param name="requestUrl"></param>
  31. /// <param name="authorization"></param>
  32. /// <returns></returns>
  33. public static string UploadFile(byte[] fileData, string fileName, string mimeType, Action<double> progressCallback = null)
  34. {
  35. var contentType = MediaTypeHeaderValue.Parse(mimeType);
  36. var requestHeads = new Dictionary<string, string>();
  37. ProductInfoHeaderValue productInfoHeaderValue = null;
  38. var authorization = GetAuthorization(fileName, HttpMethod.Put);
  39. requestHeads.Add("Authorization", authorization);
  40. var requestUrl = $"{_tencentCosConfig.UrlBucket}{fileName}";
  41. var result = ObjectStorageSingle.Instance.UploadFile(fileData, contentType, requestUrl, requestHeads, productInfoHeaderValue, progressCallback);
  42. if (result)
  43. {
  44. return requestUrl;
  45. }
  46. return string.Empty;
  47. }
  48. /// <summary>删除文件</summary>
  49. /// <param name="requestUrl"></param>
  50. /// <param name="authorization"></param>
  51. /// <returns></returns>
  52. public static bool DeleteFile(string fileUrl)
  53. {
  54. var fileName = fileUrl;
  55. var lastKeyIndex = fileUrl.LastIndexOf("/");
  56. if (lastKeyIndex >= 0 && lastKeyIndex < fileUrl.Length)
  57. {
  58. fileName = fileUrl.Substring(lastKeyIndex + 1);
  59. }
  60. var authorization = GetAuthorization(fileName, HttpMethod.Delete);
  61. var requestUrl = fileUrl;
  62. return ObjectStorageSingle.Instance.DeleteFile(requestUrl, authorization);
  63. }
  64. public static string GetAuthorization(string pathName, HttpMethod httpMethod)
  65. {
  66. var _requestParams = new List<KeyValuePair<string, string>>();
  67. var _headers = new List<KeyValuePair<string, string>>();
  68. //1. Generate KeyTime, KeyTime = [Now];[Expires] example:1557902800;1557910000
  69. var now = DateTimeOffset.Now;
  70. long startTimeStamp = now.ToUnixTimeSeconds();
  71. long endTimeStamp = now.AddDays(1).ToUnixTimeSeconds();
  72. var keyTime = $"{startTimeStamp};{endTimeStamp}";
  73. //2. Generate SignKey,SignKey = HMAC-SHA1([SecretKey], KeyTime)
  74. var signKey = HMACSHA1(_tencentCosConfig.SecretKey, keyTime);
  75. //3. Generate UrlParamList and HttpParameters HttpString = [HttpMethod]\n[HttpURI]\n[HttpParameters]\n[HttpHeaders]\n
  76. var urlParamListBuilder = new StringBuilder();
  77. var stringParamBuilder = new StringBuilder();
  78. var urlParamList = string.Empty;
  79. var httpParameters = string.Empty;
  80. if (_requestParams != null)
  81. {
  82. _requestParams.Sort();//TODO check
  83. foreach (var param in _requestParams)
  84. {
  85. var encodeKey = HttpUtility.UrlEncode(param.Key).ToLower();
  86. urlParamListBuilder.Append($"{encodeKey};");
  87. var encodeValue = HttpUtility.UrlEncode(param.Value);
  88. stringParamBuilder.Append($"{encodeKey}={encodeValue}&");
  89. }
  90. urlParamList = urlParamListBuilder.ToString();
  91. if (!string.IsNullOrEmpty(urlParamList))
  92. {
  93. urlParamList = urlParamList.TrimEnd(';');
  94. }
  95. httpParameters = stringParamBuilder.ToString();
  96. if (!string.IsNullOrEmpty(httpParameters))
  97. {
  98. httpParameters = httpParameters.TrimEnd('&');
  99. }
  100. }
  101. var headerListBuilder = new StringBuilder();
  102. var httpHeadersBuilder = new StringBuilder();
  103. var headerList = string.Empty;
  104. var httpHeaders = string.Empty;
  105. if (_headers != null)
  106. {
  107. _headers.Sort();//TODO check
  108. foreach (var param in _headers)
  109. {
  110. var encodeKey = HttpUtility.UrlEncode(param.Key).ToLower();
  111. headerListBuilder.Append($"{encodeKey};");
  112. var encodeValue = HttpUtility.UrlEncode(param.Value);
  113. httpHeadersBuilder.Append($"{encodeKey}={encodeValue}&");
  114. }
  115. headerList = headerListBuilder.ToString();
  116. if (!string.IsNullOrEmpty(headerList))
  117. {
  118. headerList = headerList.TrimEnd(';');
  119. }
  120. httpHeaders = httpHeadersBuilder.ToString();
  121. if (!string.IsNullOrEmpty(httpHeaders))
  122. {
  123. httpHeaders = httpHeaders.TrimEnd('&');
  124. }
  125. }
  126. //5. Generatet HttpString
  127. string httpString = string.Format($"{httpMethod.ToString().ToLower()}\n/{pathName}\n{httpParameters}\n{httpHeaders}\n");
  128. //6. Generate StringToSign
  129. string stringToSign = string.Format("sha1\n{0}\n{1}\n", keyTime, SHA1(httpString));
  130. //7. Generate Signature
  131. var signature = HMACSHA1(signKey, stringToSign);
  132. //return $"q-sign-algorithm=sha1&q-ak={SecretId}&q-sign-time={keyTime}&q-key-time={keyTime}&q-signature={signature}";
  133. return $"q-sign-algorithm=sha1&q-ak={_tencentCosConfig.SecretId}&q-sign-time={keyTime}&q-key-time={keyTime}&q-header-list={headerList}&q-url-param-list={urlParamList}&q-signature={signature}";
  134. }
  135. static string SHA1(string content)
  136. {
  137. var sha1 = new SHA1CryptoServiceProvider();
  138. byte[] c = Encoding.Default.GetBytes(content);
  139. byte[] sc = sha1.ComputeHash(c);
  140. StringBuilder sb = new StringBuilder("");
  141. foreach (byte b in sc)
  142. {
  143. sb.AppendFormat("{0:x2}", b);
  144. }
  145. return sb.ToString();
  146. }
  147. static string HMACSHA1(string secretKey, string content)
  148. {
  149. byte[] keyByte = Encoding.Default.GetBytes(secretKey);
  150. HMACSHA1 hmacsha1 = new HMACSHA1(keyByte);
  151. byte[] messageBytes = Encoding.Default.GetBytes(content);
  152. byte[] hashmessage = hmacsha1.ComputeHash(messageBytes);
  153. StringBuilder sb = new StringBuilder("");
  154. foreach (byte b in hashmessage)
  155. {
  156. sb.AppendFormat("{0:x2}", b);
  157. }
  158. return sb.ToString();
  159. }
  160. }
  161. public class TencentCosConfig
  162. {
  163. public TencentCosConfig(string bucket, string secretId, string secretKey)
  164. {
  165. UrlBucket = bucket;
  166. SecretId = secretId;
  167. SecretKey = secretKey;
  168. }
  169. public string UrlBucket { get; set; }
  170. public string SecretId { get; set; }
  171. public string SecretKey { get; set; }
  172. }
  173. }