Skip to content

Commit b353db6

Browse files
authored
Merge pull request #23968 from colinin/minio-blob-provider
Optimize BlobProvider
2 parents 3378435 + 6d8e39c commit b353db6

File tree

8 files changed

+56
-19
lines changed

8 files changed

+56
-19
lines changed

docs/en/framework/infrastructure/blob-storing/minio.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ Configure<AbpBlobStoringOptions>(options =>
3131
minio.AccessKey = "your minio accessKey";
3232
minio.SecretKey = "your minio secretKey";
3333
minio.BucketName = "your minio bucketName";
34+
minio.PresignedGetExpirySeconds = 3600;
3435
});
3536
});
3637
});
@@ -53,6 +54,7 @@ Configure<AbpBlobStoringOptions>(options =>
5354
* Buckets used with Amazon S3 Transfer Acceleration can't have dots (.) in their names. For more information about transfer acceleration, see Amazon S3 Transfer Acceleration.
5455
* **WithSSL** (bool): Default value is `false`,Chain to MinIO Client object to use https instead of http.
5556
* **CreateContainerIfNotExists** (bool): Default value is `false`, If a bucket does not exist in minio, `MinioBlobProvider` will try to create it.
57+
* **PresignedGetExpirySeconds** (int): Default value is `7 * 24 * 3600`, The expiration time of the pre-specified get url. The is valid within the range of 1 to 604800(corresponding to 7 days).
5658

5759

5860
## Minio Blob Name Calculator
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using System.Net.Http;
2+
3+
namespace Microsoft.Extensions.DependencyInjection;
4+
internal static class MinioHttpClientFactoryServiceCollectionExtensions
5+
{
6+
private const string HttpClientName = "__MinioApiClient";
7+
public static IServiceCollection AddMinioHttpClient(this IServiceCollection services)
8+
{
9+
services.AddHttpClient(HttpClientName);
10+
11+
return services;
12+
}
13+
14+
public static HttpClient CreateMinioHttpClient(this IHttpClientFactory httpClientFactory)
15+
{
16+
return httpClientFactory.CreateClient(HttpClientName);
17+
}
18+
}

framework/src/Volo.Abp.BlobStoring.Minio/Volo.Abp.BlobStoring.Minio.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<ItemGroup>
1919
<ProjectReference Include="..\Volo.Abp.BlobStoring\Volo.Abp.BlobStoring.csproj" />
2020
<PackageReference Include="Minio" />
21+
<PackageReference Include="Microsoft.Extensions.Http" />
2122
</ItemGroup>
2223

2324
</Project>
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1-
using Volo.Abp.Modularity;
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Volo.Abp.Modularity;
23

34
namespace Volo.Abp.BlobStoring.Minio;
45

56
[DependsOn(typeof(AbpBlobStoringModule))]
67
public class AbpBlobStoringMinioModule : AbpModule
78
{
8-
9+
public override void ConfigureServices(ServiceConfigurationContext context)
10+
{
11+
context.Services.AddMinioHttpClient();
12+
}
913
}

framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
1-
using Minio;
2-
using Minio.Exceptions;
3-
using System;
1+
using System;
42
using System.IO;
3+
using System.Net.Http;
54
using System.Threading.Tasks;
5+
using Microsoft.Extensions.DependencyInjection;
6+
using Minio;
67
using Minio.DataModel.Args;
8+
using Minio.Exceptions;
79
using Volo.Abp.DependencyInjection;
810

911
namespace Volo.Abp.BlobStoring.Minio;
1012

1113
public class MinioBlobProvider : BlobProviderBase, ITransientDependency
1214
{
15+
protected IHttpClientFactory HttpClientFactory { get; }
1316
protected IMinioBlobNameCalculator MinioBlobNameCalculator { get; }
1417
protected IBlobNormalizeNamingService BlobNormalizeNamingService { get; }
1518

1619
public MinioBlobProvider(
20+
IHttpClientFactory httpClientFactory,
1721
IMinioBlobNameCalculator minioBlobNameCalculator,
1822
IBlobNormalizeNamingService blobNormalizeNamingService)
1923
{
24+
HttpClientFactory = httpClientFactory;
2025
MinioBlobNameCalculator = minioBlobNameCalculator;
2126
BlobNormalizeNamingService = blobNormalizeNamingService;
2227
}
@@ -81,21 +86,16 @@ public async override Task<bool> ExistsAsync(BlobProviderExistsArgs args)
8186
return null;
8287
}
8388

84-
var memoryStream = new MemoryStream();
85-
await client.GetObjectAsync(new GetObjectArgs().WithBucket(containerName).WithObject(blobName).WithCallbackStream(stream =>
86-
{
87-
if (stream != null)
88-
{
89-
stream.CopyTo(memoryStream);
90-
memoryStream.Seek(0, SeekOrigin.Begin);
91-
}
92-
else
93-
{
94-
memoryStream = null;
95-
}
96-
}));
89+
var configuration = args.Configuration.GetMinioConfiguration();
90+
var downloadUrl = await client.PresignedGetObjectAsync(
91+
new PresignedGetObjectArgs()
92+
.WithBucket(containerName)
93+
.WithObject(blobName)
94+
.WithExpiry(configuration.PresignedGetExpirySeconds));
95+
96+
var httpClient = HttpClientFactory.CreateMinioHttpClient();
9797

98-
return memoryStream;
98+
return await httpClient.GetStreamAsync(downloadUrl, args.CancellationToken);
9999
}
100100

101101
protected virtual IMinioClient GetMinioClient(BlobProviderArgs args)

framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfiguration.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ public bool CreateBucketIfNotExists {
4747
set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.CreateBucketIfNotExists, value);
4848
}
4949

50+
/// <summary>
51+
/// Default value: 7 * 24 * 3600.
52+
/// </summary>
53+
public int PresignedGetExpirySeconds {
54+
get => _containerConfiguration.GetConfigurationOrDefault(MinioBlobProviderConfigurationNames.PresignedGetExpirySeconds, _defaultExpirySeconds);
55+
set => _containerConfiguration.SetConfiguration(MinioBlobProviderConfigurationNames.PresignedGetExpirySeconds, value);
56+
}
57+
58+
private int _defaultExpirySeconds = 7 * 24 * 3600;
59+
5060
private readonly BlobContainerConfiguration _containerConfiguration;
5161

5262
public MinioBlobProviderConfiguration(BlobContainerConfiguration containerConfiguration)

framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProviderConfigurationNames.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ public static class MinioBlobProviderConfigurationNames
88
public const string SecretKey = "Minio.SecretKey";
99
public const string WithSSL = "Minio.WithSSL";
1010
public const string CreateBucketIfNotExists = "Minio.CreateBucketIfNotExists";
11+
public const string PresignedGetExpirySeconds = "Minio.PresignedGetExpirySeconds";
1112
}

framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public override void ConfigureServices(ServiceConfigurationContext context)
5757
minio.WithSSL = false;
5858
minio.BucketName = _randomContainerName;
5959
minio.CreateBucketIfNotExists = true;
60+
minio.PresignedGetExpirySeconds = 3600;
6061
});
6162
});
6263
});

0 commit comments

Comments
 (0)