ServiceCollectionExtensions.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using Microsoft.Extensions.DependencyInjection;
  2. using Microsoft.Extensions.Options;
  3. using Minio;
  4. using OnceMi.AspNetCore.OSS;
  5. using ZhonTai.Admin.Core.Configs;
  6. using OSSOptions = ZhonTai.Admin.Core.Configs.OSSOptions;
  7. namespace ZhonTai.Admin.Core.Extensions;
  8. public static class ServiceCollectionExtensions
  9. {
  10. private static void CreateBucketName(IOSSServiceFactory oSSServiceFactory, OSSOptions oSSOptions)
  11. {
  12. var oSSService = oSSServiceFactory.Create(oSSOptions.Provider.ToString());
  13. if (!oSSService.BucketExistsAsync(oSSOptions.BucketName).Result)
  14. {
  15. oSSService.CreateBucketAsync(oSSOptions.BucketName).Wait();
  16. }
  17. //设置Minio存储桶权限
  18. if (oSSOptions.Provider == OSSProvider.Minio)
  19. {
  20. var bucketName = oSSOptions.BucketName;
  21. var minioClient = new MinioClient()
  22. .WithEndpoint(oSSOptions.Endpoint)
  23. .WithCredentials(oSSOptions.AccessKey, oSSOptions.SecretKey);
  24. if (oSSOptions.Region.NotNull())
  25. {
  26. minioClient.WithRegion(oSSOptions.Region);
  27. }
  28. minioClient = minioClient.Build();
  29. //查看存储桶权限
  30. //var policy = minioClient.GetPolicyAsync(new GetPolicyArgs().WithBucket(bucketName)).Result;
  31. //设置存储桶权限,存储桶内的所有文件可以通过链接永久访问
  32. 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}/*.*""]}}]}}";
  33. var setPolicyArgs = new SetPolicyArgs().WithBucket(bucketName).WithPolicy(policy);
  34. minioClient.SetPolicyAsync(setPolicyArgs).Wait();
  35. }
  36. }
  37. public static IServiceCollection AddOSS(this IServiceCollection services)
  38. {
  39. var oSSConfig = services.BuildServiceProvider().GetRequiredService<IOptions<OSSConfig>>().Value;
  40. if (oSSConfig.OSSConfigs?.Count > 0)
  41. {
  42. foreach (var oSSOptions in oSSConfig.OSSConfigs)
  43. {
  44. if (oSSOptions.Enable)
  45. {
  46. services.AddOSSService(oSSOptions.Provider.ToString(), option =>
  47. {
  48. option.Provider = oSSOptions.Provider;
  49. option.Endpoint = oSSOptions.Endpoint;
  50. option.Region = oSSOptions.Region;
  51. option.AccessKey = oSSOptions.AccessKey;
  52. option.SecretKey = oSSOptions.SecretKey;
  53. option.IsEnableHttps = oSSOptions.IsEnableHttps;
  54. option.IsEnableCache = oSSOptions.IsEnableCache;
  55. });
  56. var oSSServiceFactory = services.BuildServiceProvider().GetRequiredService<IOSSServiceFactory>();
  57. CreateBucketName(oSSServiceFactory, oSSOptions);
  58. }
  59. }
  60. }
  61. return services;
  62. }
  63. }