diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs index a562d93ee3..237465ef91 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs @@ -19,13 +19,13 @@ namespace Volo.Abp.BlobStoring.Aliyun AliyunBlobNameCalculator = aliyunBlobNameCalculator; } - private IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration) + protected virtual IOss GetOssClient(BlobContainerConfiguration blobContainerConfiguration) { var aliyunConfig = blobContainerConfiguration.GetAliyunConfiguration(); return OssClientFactory.Create(aliyunConfig); } - private IOss GetOssClient(AliyunBlobProviderConfiguration aliyunConfig) + protected virtual IOss GetOssClient(AliyunBlobProviderConfiguration aliyunConfig) { return OssClientFactory.Create(aliyunConfig); } @@ -57,9 +57,11 @@ namespace Volo.Abp.BlobStoring.Aliyun var containerName = GetContainerName(args); var blobName = AliyunBlobNameCalculator.Calculate(args); var ossClient = GetOssClient(args.Configuration); - var result = ossClient.DeleteObject(containerName, blobName); - //TODO: undifend delete flag - //https://help.aliyun.com/document_detail/91924.html + if(!BlobExistsAsync(ossClient, containerName, blobName)) + { + return Task.FromResult(false); + } + ossClient.DeleteObject(containerName, blobName); return Task.FromResult(true); } @@ -71,7 +73,7 @@ namespace Volo.Abp.BlobStoring.Aliyun return Task.FromResult(BlobExistsAsync(ossClient, containerName, blobName)); } - public override Task GetOrNullAsync(BlobProviderGetArgs args) + public override async Task GetOrNullAsync(BlobProviderGetArgs args) { var containerName = GetContainerName(args); var blobName = AliyunBlobNameCalculator.Calculate(args); @@ -81,7 +83,9 @@ namespace Volo.Abp.BlobStoring.Aliyun return null; } var result = ossClient.GetObject(containerName, blobName); - return Task.FromResult(result.Content); + var memoryStream = new MemoryStream(); + await result.Content.CopyToAsync(memoryStream); + return memoryStream; } private static string GetContainerName(BlobProviderArgs args) diff --git a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/DefaultOssClientFactory.cs b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/DefaultOssClientFactory.cs index 8b8e466232..8f69603f7c 100644 --- a/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/DefaultOssClientFactory.cs +++ b/framework/src/Volo.Abp.BlobStoring.Aliyun/Volo/Abp/BlobStoring/Aliyun/DefaultOssClientFactory.cs @@ -16,11 +16,11 @@ namespace Volo.Abp.BlobStoring.Aliyun /// public class DefaultOssClientFactory : IOssClientFactory, ITransientDependency { - private readonly IDistributedCache _cache; + protected IDistributedCache Cache { get; } public DefaultOssClientFactory( IDistributedCache cache) { - _cache = cache; + Cache = cache; } public virtual IOss Create(AliyunBlobProviderConfiguration aliyunConfig) @@ -34,7 +34,7 @@ namespace Volo.Abp.BlobStoring.Aliyun { //STS temporary authorization to access OSS var key = aliyunConfig.ToKeyString(); - var cacheItem = _cache.Get(key); + var cacheItem = Cache.Get(key); if (cacheItem == null) { IClientProfile profile = DefaultProfile.GetProfile( @@ -55,7 +55,7 @@ namespace Volo.Abp.BlobStoring.Aliyun }; var response = client.GetAcsResponse(request); cacheItem = new AssumeRoleCredentialsCacheItem(response.Credentials.AccessKeyId, response.Credentials.AccessKeySecret, response.Credentials.SecurityToken); - _cache.Set(key, cacheItem, new DistributedCacheEntryOptions() + Cache.Set(key, cacheItem, new DistributedCacheEntryOptions() { //Subtract 10 seconds of network request time. AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(aliyunConfig.DurationSeconds - 10) diff --git a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj index 121832cefb..8c5097bd84 100644 --- a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj +++ b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo.Abp.BlobStoring.Aliyun.Tests.csproj @@ -5,7 +5,7 @@ netcoreapp3.1 - fe9a87da-3584-40e0-a06c-aa499936015d + 9f0d2c00-80c1-435b-bfab-2c39c8249091 diff --git a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo/Abp/BlobStoring/Aliyun/AbpBlobStoringAliyunTestModule.cs b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo/Abp/BlobStoring/Aliyun/AbpBlobStoringAliyunTestModule.cs index 6c14cebbb8..1635e3390f 100644 --- a/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo/Abp/BlobStoring/Aliyun/AbpBlobStoringAliyunTestModule.cs +++ b/framework/test/Volo.Abp.BlobStoring.Aliyun.Tests/Volo/Abp/BlobStoring/Aliyun/AbpBlobStoringAliyunTestModule.cs @@ -1,6 +1,8 @@ -using Microsoft.Extensions.Configuration; +using Aliyun.OSS; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System; +using System.Linq; using Volo.Abp.Modularity; namespace Volo.Abp.BlobStoring.Aliyun @@ -19,7 +21,7 @@ namespace Volo.Abp.BlobStoring.Aliyun )] public class AbpBlobStoringAliyunTestModule : AbpModule { - private const string UserSecretsId = "fe9a87da-3584-40e0-a06c-aa499936015d"; + private const string UserSecretsId = "9f0d2c00-80c1-435b-bfab-2c39c8249091"; private AliyunBlobProviderConfiguration _configuration; private readonly string _randomContainerName = "abp-aliyun-test-container-" + Guid.NewGuid().ToString("N"); @@ -32,11 +34,11 @@ namespace Volo.Abp.BlobStoring.Aliyun })); var configuration = context.Services.GetConfiguration(); - var _accessKeyId = configuration["Aliyun:AccessKeyId"]; - var _accessKeySecret = configuration["Aliyun:AccessKeySecret"]; - var _endpoint = configuration["Aliyun:Endpoint"]; - var _regionId = configuration["Aliyun:RegionId"]; - var _roleArn = configuration["Aliyun:RoleArn"]; + var accessKeyId = configuration["Aliyun:AccessKeyId"]; + var accessKeySecret = configuration["Aliyun:AccessKeySecret"]; + var endpoint = configuration["Aliyun:Endpoint"]; + var regionId = configuration["Aliyun:RegionId"]; + var roleArn = configuration["Aliyun:RoleArn"]; Configure(options => { @@ -44,14 +46,14 @@ namespace Volo.Abp.BlobStoring.Aliyun { containerConfiguration.UseAliyun(aliyun => { - aliyun.AccessKeyId = _accessKeyId; - aliyun.AccessKeySecret = _accessKeySecret; - aliyun.Endpoint = _endpoint; + aliyun.AccessKeyId = accessKeyId; + aliyun.AccessKeySecret = accessKeySecret; + aliyun.Endpoint = endpoint; //STS - aliyun.RegionId = _regionId; - aliyun.RoleArn = _roleArn; + aliyun.RegionId = regionId; + aliyun.RoleArn = roleArn; aliyun.RoleSessionName = Guid.NewGuid().ToString("N"); - aliyun.DurationSeconds = 3600; + aliyun.DurationSeconds = 0; aliyun.Policy = String.Empty; //Other aliyun.CreateContainerIfNotExists = true; @@ -66,7 +68,16 @@ namespace Volo.Abp.BlobStoring.Aliyun { var ossClientFactory = context.ServiceProvider.GetService(); var ossClient = ossClientFactory.Create(_configuration); - ossClient.DeleteBucket(_randomContainerName); + if(ossClient.DoesBucketExist(_randomContainerName)) + { + var objects = ossClient.ListObjects(_randomContainerName); + if (objects.ObjectSummaries.Any()) + { + ossClient.DeleteObjects(new DeleteObjectsRequest(_randomContainerName, + objects.ObjectSummaries.Select(o => o.Key).ToList())); + } + ossClient.DeleteBucket(_randomContainerName); + } } }