FileUpload.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. using Aliyun.OSS;
  2. using Microsoft.AspNetCore.Http;
  3. using Newtonsoft.Json.Linq;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Net.Http;
  9. using System.Security.Cryptography;
  10. using System.Threading.Tasks;
  11. using Wicture.DbRESTFul;
  12. namespace JiaZhiQuan.Common.AliOSS
  13. {
  14. public class FileUpload
  15. {
  16. private static readonly string[] ImageFileExtensions = new[] { "png", "jpg", "jpeg", "gif", "bmp" };
  17. public async static Task<UploadResult> UploadFromRequest(IHttpClientFactory httpClientFactory, IFormFile file, string destFileName, string destDir, OSSConfig config, int maxSize = 2, bool isImage = true)
  18. {
  19. OssClient ossClient = new OssClient(config.EndPoint, config.AccessKeyId, config.AccessKeySecret);
  20. return await UploadFromRequest(httpClientFactory, file, destFileName, destDir, config, ossClient, maxSize, isImage);
  21. }
  22. public class UploadResult
  23. {
  24. public int width { get; set; }
  25. public int height { get; set; }
  26. public string url { get; set; }
  27. }
  28. public async static Task<UploadResult> UploadFromRequest(IHttpClientFactory httpClientFactory, IFormFile file, string destFileName, string destDir, OSSConfig config, OssClient ossClient, int maxSize = 2, bool isImage = true)
  29. {
  30. var extension = Path.GetExtension(file.FileName);
  31. if (isImage && ImageFileExtensions.All(e => !extension.ToLower().Equals("." + e)))
  32. {
  33. throw new LogicalException("仅支持上传图片格式", ErrorCodes.UploadFileFormatError);
  34. }
  35. if (file.Length > maxSize * 1024 * 1024)
  36. {
  37. throw new LogicalException("上传的" + (isImage ? "图片" : "文件") + "不能大于" + maxSize + "M", ErrorCodes.UploadFileSizeLimitError);
  38. }
  39. var dir = destDir.Trim(new char[] { '\\', '/' });
  40. if (string.IsNullOrEmpty(dir))
  41. {
  42. destFileName = destFileName.Trim(new char[] { '\\', '/' }) + extension;
  43. }
  44. else
  45. {
  46. destFileName = dir + "/" + destFileName.Trim(new char[] { '\\', '/' }) + extension;
  47. }
  48. using Stream fileStream = file.OpenReadStream();
  49. if (isImage)
  50. {
  51. int width = 0;
  52. int height = 0;
  53. string url = await UploadToAliyun(destFileName, fileStream, config, ossClient);
  54. var reqUrl = string.IsNullOrEmpty(config.InternalDomainUrl) ? url : config.InternalDomainUrl + destFileName;
  55. var client = httpClientFactory.CreateClient();
  56. client.Timeout = new TimeSpan(0, 0, 2);
  57. try
  58. {
  59. var content = JToken.Parse(await client.GetStringAsync(reqUrl + "?x-oss-process=image/info"));
  60. width = content.Value<JToken>("ImageWidth").Value<int>("value");
  61. height = content.Value<JToken>("ImageHeight").Value<int>("value");
  62. }
  63. catch (Exception ex)
  64. {
  65. LoggerManager.Logger.Error(ex, "获取图片属性出错 >>> " + reqUrl + "\r\n" + ex.Message);
  66. }
  67. return new UploadResult()
  68. {
  69. url = url,
  70. width = width,
  71. height = height
  72. };
  73. }
  74. else
  75. {
  76. var url = await UploadToAliyun(destFileName, fileStream, config, ossClient);
  77. return new UploadResult()
  78. {
  79. url = url
  80. };
  81. }
  82. }
  83. //public static string UploadToAliyun(string destFilePath, string localFilePath, OSSConfig config)
  84. //{
  85. // OssClient ossClient = new OssClient(config.EndPoint, config.AccessKeyId, config.AccessKeySecret);
  86. // return UploadToAliyun(destFilePath, localFilePath, config.OSSBucket, config.DomainUrl, ossClient);
  87. //}
  88. public async static Task<string> UploadToAliyun(string destFilePath, Stream stream, OSSConfig config, ObjectMetadata metadata = null)
  89. {
  90. OssClient ossClient = new OssClient(config.EndPoint, config.AccessKeyId, config.AccessKeySecret);
  91. return await UploadToAliyun(destFilePath, stream, config.OSSBucket, config.DomainUrl, ossClient, metadata);
  92. }
  93. //public static string UploadToAliyun(string destFilePath, string localFilePath, OSSConfig config, OssClient ossClient)
  94. //{
  95. // return UploadToAliyun(destFilePath, localFilePath, config.OSSBucket, config.DomainUrl, ossClient);
  96. //}
  97. public async static Task<string> UploadToAliyun(string destFilePath, Stream stream, OSSConfig config, OssClient ossClient, ObjectMetadata metadata = null)
  98. {
  99. return await UploadToAliyun(destFilePath, stream, config.OSSBucket, config.DomainUrl, ossClient, metadata);
  100. }
  101. //public async static string UploadToAliyun(string destFilePath, string localFilePath, string ossBucket, string domainUrl, OssClient ossClient)
  102. //{
  103. // var rst = await Task<PutObjectResult>.Factory.FromAsync(ossClient.BeginPutObject, ossClient.EndPutObject, ossBucket, localFilePath, null);
  104. // var result = ossClient.PutObject(ossBucket, destFilePath, localFilePath);
  105. // if (result.HttpStatusCode == System.Net.HttpStatusCode.OK)
  106. // {
  107. // return domainUrl + destFilePath;
  108. // }
  109. // else
  110. // {
  111. // throw new LogicalException("上传失败", ErrorCodes.UploadFileToOSSError);
  112. // }
  113. //}
  114. public async static Task<string> UploadToAliyun(string destFilePath, Stream stream, string ossBucket, string domainUrl, OssClient ossClient, ObjectMetadata metadata = null)
  115. {
  116. using (stream)
  117. {
  118. stream.Position = 0;
  119. var tcs = new TaskCompletionSource<PutObjectResult>();
  120. ossClient.BeginPutObject(ossBucket, destFilePath, stream, metadata, iar =>
  121. {
  122. tcs.SetResult(ossClient.EndPutObject(iar));
  123. }, null);
  124. var result = await tcs.Task;
  125. // var result = await Task<PutObjectResult>.Factory.FromAsync(ossClient.BeginPutObject, ossClient.EndPutObject, ossBucket, destFilePath, stream, null);
  126. if (result.ResponseStream != null)
  127. {
  128. result.ResponseStream.Close();
  129. }
  130. if (result.HttpStatusCode == System.Net.HttpStatusCode.OK)
  131. {
  132. return domainUrl + destFilePath;
  133. }
  134. else
  135. {
  136. throw new LogicalException("上传失败", ErrorCodes.UploadFileToOSSError);
  137. }
  138. }
  139. }
  140. public static string GetFileIdByUrl(string url)
  141. {
  142. if (string.IsNullOrEmpty(url))
  143. {
  144. return string.Empty;
  145. }
  146. url = url.Split(new char[] { '?' })[0];
  147. var parts = url.Split(new string[] { "cdndev.olssglobal.com/", "olscdn.olssglobal.com/", "videodev.olssglobal.com/", "video.olssglobal.com/" }, StringSplitOptions.None);
  148. if (parts.Length > 1)
  149. {
  150. return parts[parts.Length - 1];
  151. }
  152. return string.Empty;
  153. }
  154. public static void RemoveFile(List<string> keys, string bucketName, OssClient ossClient)
  155. {
  156. ossClient.DeleteObjects(new DeleteObjectsRequest(bucketName, keys));
  157. }
  158. }
  159. }