diff --git a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN.Abp.BlobStoring.Tencent.csproj b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN.Abp.BlobStoring.Tencent.csproj index 73881e41b..700366a15 100644 --- a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN.Abp.BlobStoring.Tencent.csproj +++ b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN.Abp.BlobStoring.Tencent.csproj @@ -15,20 +15,21 @@ - + - + + - + diff --git a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/AbpBlobStoringTencentCloudModule.cs b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/AbpBlobStoringTencentCloudModule.cs index f65c17d9d..d47517557 100644 --- a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/AbpBlobStoringTencentCloudModule.cs +++ b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/AbpBlobStoringTencentCloudModule.cs @@ -1,5 +1,6 @@ using LINGYUN.Abp.Tencent; using LINGYUN.Abp.Tencent.Localization; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.BlobStoring; using Volo.Abp.Localization; using Volo.Abp.Modularity; @@ -25,5 +26,7 @@ public class AbpBlobStoringTencentCloudModule : AbpModule .Get() .AddVirtualJson("/LINGYUN/Abp/BlobStoring/Tencent/Localization"); }); + + context.Services.AddTenantOssClient(); } } \ No newline at end of file diff --git a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/BlobStoringTencentConsts.cs b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/BlobStoringTencentConsts.cs new file mode 100644 index 000000000..39774e7df --- /dev/null +++ b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/BlobStoringTencentConsts.cs @@ -0,0 +1,5 @@ +namespace LINGYUN.Abp.BlobStoring.Tencent; +internal static class BlobStoringTencentConsts +{ + public const string HttpClient = "BlobStoring.Tencent"; +} diff --git a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/TencentCloudBlobProvider.cs b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/TencentCloudBlobProvider.cs index ac6fa4629..d399ac1e2 100644 --- a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/TencentCloudBlobProvider.cs +++ b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/LINGYUN/Abp/BlobStoring/Tencent/TencentCloudBlobProvider.cs @@ -6,6 +6,7 @@ using LINGYUN.Abp.Tencent.Features; using System; using System.Collections.Generic; using System.IO; +using System.Net.Http; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.BlobStoring; @@ -19,15 +20,18 @@ public class TencentCloudBlobProvider : BlobProviderBase, ITransientDependency { protected IFeatureChecker FeatureChecker { get; } protected ICosClientFactory CosClientFactory { get; } + protected IHttpClientFactory HttpClientFactory { get; } protected ITencentBlobNameCalculator TencentBlobNameCalculator { get; } public TencentCloudBlobProvider( IFeatureChecker featureChecker, ICosClientFactory cosClientFactory, + IHttpClientFactory httpClientFactory, ITencentBlobNameCalculator tencentBlobNameCalculator) { FeatureChecker = featureChecker; CosClientFactory = cosClientFactory; + HttpClientFactory = httpClientFactory; TencentBlobNameCalculator = tencentBlobNameCalculator; } @@ -65,12 +69,13 @@ public class TencentCloudBlobProvider : BlobProviderBase, ITransientDependency // TODO: 未经验证 - var request = new GetObjectBytesRequest(GetBucketName(args), blobName); - var ossObject = ossClient.GetObject(request); - var memoryStream = new MemoryStream(); - await memoryStream.WriteAsync(ossObject.content, 0, ossObject.content.Length); - memoryStream.Seek(0, SeekOrigin.Begin); - return memoryStream; + var ossDownloadUrl = ossClient.GetObjectUrl(GetBucketName(args), blobName); + + var client = HttpClientFactory.CreateTenantOssClient(); + + var ossContent = await client.GetStreamAsync(ossDownloadUrl); + + return ossContent; } public override async Task SaveAsync(BlobProviderSaveArgs args) diff --git a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/Microsoft/Extensions/DependencyInjection/BlobStoringTencentHttpClientFactoryServiceCollectionExtensions.cs b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/Microsoft/Extensions/DependencyInjection/BlobStoringTencentHttpClientFactoryServiceCollectionExtensions.cs new file mode 100644 index 000000000..3deb883ca --- /dev/null +++ b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/Microsoft/Extensions/DependencyInjection/BlobStoringTencentHttpClientFactoryServiceCollectionExtensions.cs @@ -0,0 +1,12 @@ +using LINGYUN.Abp.BlobStoring.Tencent; + +namespace Microsoft.Extensions.DependencyInjection; +internal static class BlobStoringTencentHttpClientFactoryServiceCollectionExtensions +{ + public static IServiceCollection AddTenantOssClient(this IServiceCollection services) + { + services.AddHttpClient(BlobStoringTencentConsts.HttpClient); + + return services; + } +} diff --git a/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/System/Net/Http/BlobStoringTencentHttpClientFactoryExtenssions.cs b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/System/Net/Http/BlobStoringTencentHttpClientFactoryExtenssions.cs new file mode 100644 index 000000000..585e32241 --- /dev/null +++ b/aspnet-core/framework/cloud-tencent/LINGYUN.Abp.BlobStoring.Tencent/System/Net/Http/BlobStoringTencentHttpClientFactoryExtenssions.cs @@ -0,0 +1,11 @@ +using LINGYUN.Abp.BlobStoring.Tencent; + +namespace System.Net.Http; +public static class BlobStoringTencentHttpClientFactoryExtenssions +{ + public static HttpClient CreateTenantOssClient( + this IHttpClientFactory httpClientFactory) + { + return httpClientFactory.CreateClient(BlobStoringTencentConsts.HttpClient); ; + } +} diff --git a/aspnet-core/framework/common/LINGYUN.Abp.BlobStoring.Aliyun/LINGYUN/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs b/aspnet-core/framework/common/LINGYUN.Abp.BlobStoring.Aliyun/LINGYUN/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs index 4fb3ce253..63c09c373 100644 --- a/aspnet-core/framework/common/LINGYUN.Abp.BlobStoring.Aliyun/LINGYUN/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs +++ b/aspnet-core/framework/common/LINGYUN.Abp.BlobStoring.Aliyun/LINGYUN/Abp/BlobStoring/Aliyun/AliyunBlobProvider.cs @@ -56,9 +56,7 @@ public class AliyunBlobProvider : BlobProviderBase, ITransientDependency } var ossObject = ossClient.GetObject(GetBucketName(args), blobName); - var memoryStream = new MemoryStream(); - await ossObject.Content.CopyToAsync(memoryStream); - return memoryStream; + return ossObject.Content; } public override async Task SaveAsync(BlobProviderSaveArgs args) diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs index 074987114..1f57728b2 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssObject.cs @@ -44,7 +44,7 @@ public class OssObject public void SetContent(Stream stream) { _content = stream; - if (!_content.IsNullOrEmpty()) + if (!_content.IsNullOrEmpty() && _content.CanSeek && _content.Position != 0) { _content.Seek(0, SeekOrigin.Begin); } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN.Abp.OssManagement.Minio.csproj b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN.Abp.OssManagement.Minio.csproj index fc49e5d60..321471295 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN.Abp.OssManagement.Minio.csproj +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN.Abp.OssManagement.Minio.csproj @@ -15,6 +15,7 @@ + diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/AbpOssManagementMinioModule.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/AbpOssManagementMinioModule.cs index b7882b2f0..f158620a1 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/AbpOssManagementMinioModule.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/AbpOssManagementMinioModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.BlobStoring.Minio; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.BlobStoring.Minio; using Volo.Abp.Modularity; namespace LINGYUN.Abp.OssManagement.Minio; @@ -8,4 +9,8 @@ namespace LINGYUN.Abp.OssManagement.Minio; typeof(AbpOssManagementDomainModule))] public class AbpOssManagementMinioModule : AbpModule { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddMinioHttpClient(); + } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs index be388e879..e157a0be6 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Linq.Dynamic.Core; +using System.Net.Http; using System.Reactive.Linq; using System.Threading.Tasks; using Volo.Abp; @@ -29,6 +30,7 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; } protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; } protected IBlobContainerConfigurationProvider ConfigurationProvider { get; } + protected IHttpClientFactory HttpClientFactory { get; } protected IClock Clock { get; } protected ICurrentTenant CurrentTenant { get; } @@ -42,12 +44,14 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor IBlobNormalizeNamingService blobNormalizeNamingService, IBlobContainerConfigurationProvider configurationProvider, IServiceScopeFactory serviceScopeFactory, + IHttpClientFactory httpClientFactory, IOptions options) : base(options, serviceScopeFactory) { Clock = clock; Logger = logger; CurrentTenant = currentTenant; + HttpClientFactory = httpClientFactory; MinioBlobNameCalculator = minioBlobNameCalculator; BlobNormalizeNamingService = blobNormalizeNamingService; ConfigurationProvider = configurationProvider; @@ -440,23 +444,10 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor throw new BusinessException(code: OssManagementErrorCodes.ObjectNotFound); } - var memoryStream = new MemoryStream(); - var getObjectArgs = new GetObjectArgs() + var getObjectResult = await client.StatObjectAsync( + new StatObjectArgs() .WithBucket(bucket) - .WithObject(objectName) - .WithCallbackStream((stream) => - { - if (stream != null) - { - stream.CopyTo(memoryStream); - memoryStream.Seek(0, SeekOrigin.Begin); - } - else - { - memoryStream = null; - } - }); - var getObjectResult = await client.GetObjectAsync(getObjectArgs); + .WithObject(objectName)); var ossObject = new OssObject( !objectPath.IsNullOrWhiteSpace() @@ -465,7 +456,7 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor request.Path, getObjectResult.ETag, getObjectResult.LastModified, - memoryStream.Length, + getObjectResult.Size, getObjectResult.LastModified, getObjectResult.MetaData, getObjectResult.ObjectName.EndsWith("/")) @@ -473,9 +464,16 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor FullName = getObjectResult.ObjectName.Replace(prefixPath, "") }; - if (memoryStream.Length > 0) + if (getObjectResult.Size > 0) { - ossObject.SetContent(memoryStream); + var objectUrl = await client.PresignedGetObjectAsync( + new PresignedGetObjectArgs() + .WithBucket(bucket) + .WithObject(objectName) + .WithExpiry(3600)); + var httpClient = HttpClientFactory.CreateMinioHttpClient(); + + ossObject.SetContent(await httpClient.GetStreamAsync(objectUrl)); } return ossObject; diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/Microsoft/Extensions/DependencyInjection/MinioHttpClientFactoryServiceCollectionExtensions.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/Microsoft/Extensions/DependencyInjection/MinioHttpClientFactoryServiceCollectionExtensions.cs new file mode 100644 index 000000000..f2e48fcb8 --- /dev/null +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/Microsoft/Extensions/DependencyInjection/MinioHttpClientFactoryServiceCollectionExtensions.cs @@ -0,0 +1,18 @@ +using System.Net.Http; + +namespace Microsoft.Extensions.DependencyInjection; +internal static class MinioHttpClientFactoryServiceCollectionExtensions +{ + private const string HttpClientName = "__AbpMinioHttpClient"; + public static IServiceCollection AddMinioHttpClient(this IServiceCollection services) + { + services.AddHttpClient(HttpClientName); + + return services; + } + + public static HttpClient CreateMinioHttpClient(this IHttpClientFactory httpClientFactory) + { + return httpClientFactory.CreateClient(HttpClientName); + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Nexus/LINGYUN/Abp/OssManagement/Nexus/NexusOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Nexus/LINGYUN/Abp/OssManagement/Nexus/NexusOssContainer.cs index 197059da4..8e2b328c0 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Nexus/LINGYUN/Abp/OssManagement/Nexus/NexusOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Nexus/LINGYUN/Abp/OssManagement/Nexus/NexusOssContainer.cs @@ -301,7 +301,7 @@ internal class NexusOssContainer : OssContainerBase, IOssObjectExpireor } } - return new OssObject( + var ossObject = new OssObject( blobName, blobPath, checksum?.GetOrDefault("md5")?.ToString(), @@ -309,7 +309,13 @@ internal class NexusOssContainer : OssContainerBase, IOssObjectExpireor coreUIResponse.Result.Data.Size, coreUIResponse.Result.Data.BlobUpdated, metadata - ); + ); + + var ossContent = await NexusAssetManager.GetContentOrNullAsync(nexusAssetItem); + + ossObject.SetContent(ossContent); + + return ossObject; } protected virtual NexusBlobProviderConfiguration GetNexusConfiguration() diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainer.cs index 87153273f..2f7877749 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainer.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net.Http; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.MultiTenancy; @@ -24,10 +25,12 @@ internal class TencentOssContainer : OssContainerBase, IOssObjectExpireor protected IClock Clock { get; } protected ICurrentTenant CurrentTenant { get; } protected ICosClientFactory CosClientFactory { get; } + protected IHttpClientFactory HttpClientFactory { get; } public TencentOssContainer( IClock clock, ICurrentTenant currentTenant, ICosClientFactory cosClientFactory, + IHttpClientFactory httpClientFactory, IServiceScopeFactory serviceScopeFactory, IOptions options) : base(options, serviceScopeFactory) @@ -35,6 +38,7 @@ internal class TencentOssContainer : OssContainerBase, IOssObjectExpireor Clock = clock; CurrentTenant = currentTenant; CosClientFactory = cosClientFactory; + HttpClientFactory = httpClientFactory; } public async override Task BulkDeleteObjectsAsync(BulkDeleteObjectRequest request) { @@ -386,6 +390,11 @@ internal class TencentOssContainer : OssContainerBase, IOssObjectExpireor getObjectRequest.SetQueryParameter(request.Process, null); } var objectResult = ossClient.GetObject(getObjectRequest); + var objectDownloadUrl = ossClient.GetObjectUrl(request.Bucket, objectName); + + var client = HttpClientFactory.CreateTenantOssClient(); + var objectContent = await client.GetStreamAsync(objectDownloadUrl); + var ossObject = new OssObject( !objectPath.IsNullOrWhiteSpace() ? objectResult.Key.Replace(objectPath, "") @@ -393,7 +402,7 @@ internal class TencentOssContainer : OssContainerBase, IOssObjectExpireor request.Path, objectResult.eTag, null, - objectResult.content.Length, + objectContent.Length, null, new Dictionary(), objectResult.Key.EndsWith("/")) @@ -401,12 +410,9 @@ internal class TencentOssContainer : OssContainerBase, IOssObjectExpireor FullName = objectResult.Key }; - if (objectResult.content.Length > 0) + if (objectContent.Length > 0) { - var memoryStream = new MemoryStream(); - await memoryStream.WriteAsync(objectResult.content, 0, objectResult.content.Length); - memoryStream.Seek(0, SeekOrigin.Begin); - ossObject.SetContent(memoryStream); + ossObject.SetContent(objectContent); } return ossObject; diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainerFactory.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainerFactory.cs index 625a736dd..8f59ea33e 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainerFactory.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainerFactory.cs @@ -1,6 +1,7 @@ using LINGYUN.Abp.BlobStoring.Tencent; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using System.Net.Http; using Volo.Abp.MultiTenancy; using Volo.Abp.Timing; @@ -11,7 +12,7 @@ public class TencentOssContainerFactory : IOssContainerFactory protected IClock Clock { get; } protected ICurrentTenant CurrentTenant { get; } protected ICosClientFactory CosClientFactory { get; } - + protected IHttpClientFactory HttpClientFactory { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } protected IOptions Options { get; } @@ -19,12 +20,14 @@ public class TencentOssContainerFactory : IOssContainerFactory IClock clock, ICurrentTenant currentTenant, ICosClientFactory cosClientFactory, + IHttpClientFactory httpClientFactory, IServiceScopeFactory serviceScopeFactory, IOptions options) { Clock = clock; CurrentTenant = currentTenant; CosClientFactory = cosClientFactory; + HttpClientFactory = httpClientFactory; Options = options; ServiceScopeFactory = serviceScopeFactory; } @@ -35,6 +38,7 @@ public class TencentOssContainerFactory : IOssContainerFactory Clock, CurrentTenant, CosClientFactory, + HttpClientFactory, ServiceScopeFactory, Options); }