ServiceCollectionExtensions.cs 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using Microsoft.AspNetCore.Hosting;
  2. using Microsoft.Extensions.Configuration;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Minio;
  5. using OnceMi.AspNetCore.OSS;
  6. using ZhonTai.Admin.Core.Configs;
  7. using ZhonTai.Common.Helpers;
  8. using OSSOptions = ZhonTai.Admin.Core.Configs.OSSOptions;
  9. namespace ZhonTai.Admin.Core.Extensions;
  10. public static class ServiceCollectionExtensions
  11. {
  12. private static void CreateBucketName(IOSSServiceFactory oSSServiceFactory, OSSOptions oSSOptions)
  13. {
  14. var oSSService = oSSServiceFactory.Create(oSSOptions.Provider.ToString());
  15. if (!oSSService.BucketExistsAsync(oSSOptions.BucketName).Result)
  16. {
  17. oSSService.CreateBucketAsync(oSSOptions.BucketName).Wait();
  18. }
  19. //设置Minio存储桶权限
  20. if (oSSOptions.Provider == OSSProvider.Minio)
  21. {
  22. var bucketName = oSSOptions.BucketName;
  23. var minioClient = new MinioClient()
  24. .WithEndpoint(oSSOptions.Endpoint)
  25. .WithCredentials(oSSOptions.AccessKey, oSSOptions.SecretKey);
  26. if (oSSOptions.Region.NotNull())
  27. {
  28. minioClient.WithRegion(oSSOptions.Region);
  29. }
  30. minioClient = minioClient.Build();
  31. //查看存储桶权限
  32. //var policy = minioClient.GetPolicyAsync(new GetPolicyArgs().WithBucket(bucketName)).Result;
  33. //设置存储桶权限,存储桶内的所有文件可以通过链接永久访问
  34. var policy = $@"{{""Version"":""2012-10-17"",""Statement"":[{{""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Action"":[""s3:GetBucketLocation""],""Resource"":[""arn:aws:s3:::{bucketName}""]}},{{""Effect"":""Allow"",""Principal"":{{""AWS"":[""*""]}},""Action"":[""s3:GetObject""],""Resource"":[""arn:aws:s3:::{bucketName}/*.*""]}}]}}";
  35. var setPolicyArgs = new SetPolicyArgs().WithBucket(bucketName).WithPolicy(policy);
  36. minioClient.SetPolicyAsync(setPolicyArgs).Wait();
  37. }
  38. }
  39. public static IServiceCollection AddOSS(this IServiceCollection services)
  40. {
  41. var env = services.BuildServiceProvider().GetRequiredService<IWebHostEnvironment>();
  42. var oSSConfigRoot = ConfigHelper.Load("ossconfig", env.EnvironmentName, true);
  43. services.Configure<OSSConfig>(oSSConfigRoot);
  44. var oSSConfig = oSSConfigRoot.Get<OSSConfig>();
  45. if (oSSConfig.OSSConfigs?.Count > 0)
  46. {
  47. foreach (var oSSOptions in oSSConfig.OSSConfigs)
  48. {
  49. if (oSSOptions.Enable)
  50. {
  51. services.AddOSSService(oSSOptions.Provider.ToString(), option =>
  52. {
  53. option.Provider = oSSOptions.Provider;
  54. option.Endpoint = oSSOptions.Endpoint;
  55. option.Region = oSSOptions.Region;
  56. option.AccessKey = oSSOptions.AccessKey;
  57. option.SecretKey = oSSOptions.SecretKey;
  58. option.IsEnableHttps = oSSOptions.IsEnableHttps;
  59. option.IsEnableCache = oSSOptions.IsEnableCache;
  60. });
  61. var oSSServiceFactory = services.BuildServiceProvider().GetRequiredService<IOSSServiceFactory>();
  62. CreateBucketName(oSSServiceFactory, oSSOptions);
  63. }
  64. }
  65. }
  66. return services;
  67. }
  68. }