Browse Source

Add ServiceURL configuration for S3-compatible APIs

- Introduced a new property `ServiceURL` in `AwsBlobProviderConfiguration` to allow custom service URLs for S3-compatible APIs like MinIO and DigitalOcean Spaces.
- Updated `AwsBlobProviderConfigurationNames` to include the new `ServiceURL` constant.
- Modified `DefaultAmazonS3ClientFactory` to utilize the `ServiceURL` when creating the S3 client configuration, enabling support for custom endpoints.
pull/22962/head
enisn 1 year ago
parent
commit
24c27154d9
No known key found for this signature in database GPG Key ID: A052619F04155D1C
  1. 9
      framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs
  2. 1
      framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfigurationNames.cs
  3. 27
      framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/DefaultAmazonS3ClientFactory.cs

9
framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfiguration.cs

@ -62,6 +62,15 @@ public class AwsBlobProviderConfiguration
set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.Region, Check.NotNull(value, nameof(value))); set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.Region, Check.NotNull(value, nameof(value)));
} }
/// <summary>
/// Custom service URL for S3-compatible APIs (e.g., MinIO, DigitalOcean Spaces).
/// If not specified, the default AWS S3 service URL will be used based on the region.
/// </summary>
public string? ServiceURL {
get => _containerConfiguration.GetConfigurationOrDefault<string>(AwsBlobProviderConfigurationNames.ServiceURL);
set => _containerConfiguration.SetConfiguration(AwsBlobProviderConfigurationNames.ServiceURL, value);
}
/// <summary> /// <summary>
/// This name may only contain lowercase letters, numbers, and hyphens, and must begin with a letter or a number. /// This name may only contain lowercase letters, numbers, and hyphens, and must begin with a letter or a number.
/// Each hyphen must be preceded and followed by a non-hyphen character. /// Each hyphen must be preceded and followed by a non-hyphen character.

1
framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/AwsBlobProviderConfigurationNames.cs

@ -14,6 +14,7 @@ public static class AwsBlobProviderConfigurationNames
public const string Name = "Aws.Name"; public const string Name = "Aws.Name";
public const string Policy = "Aws.Policy"; public const string Policy = "Aws.Policy";
public const string Region = "Aws.Region"; public const string Region = "Aws.Region";
public const string ServiceURL = "Aws.ServiceURL";
public const string ContainerName = "Aws.ContainerName"; public const string ContainerName = "Aws.ContainerName";
public const string CreateContainerIfNotExists = "Aws.CreateContainerIfNotExists"; public const string CreateContainerIfNotExists = "Aws.CreateContainerIfNotExists";
} }

27
framework/src/Volo.Abp.BlobStoring.Aws/Volo/Abp/BlobStoring/Aws/DefaultAmazonS3ClientFactory.cs

@ -31,30 +31,47 @@ public class DefaultAmazonS3ClientFactory : IAmazonS3ClientFactory, ITransientDe
AwsBlobProviderConfiguration configuration) AwsBlobProviderConfiguration configuration)
{ {
var region = RegionEndpoint.GetBySystemName(configuration.Region); var region = RegionEndpoint.GetBySystemName(configuration.Region);
var clientConfig = CreateS3ClientConfig(configuration, region);
if (configuration.UseCredentials) if (configuration.UseCredentials)
{ {
var awsCredentials = GetAwsCredentials(configuration); var awsCredentials = GetAwsCredentials(configuration);
return awsCredentials == null return awsCredentials == null
? new AmazonS3Client(region) ? new AmazonS3Client(clientConfig)
: new AmazonS3Client(awsCredentials, region); : new AmazonS3Client(awsCredentials, clientConfig);
} }
if (configuration.UseTemporaryCredentials) if (configuration.UseTemporaryCredentials)
{ {
return new AmazonS3Client(await GetTemporaryCredentialsAsync(configuration), region); return new AmazonS3Client(await GetTemporaryCredentialsAsync(configuration), clientConfig);
} }
if (configuration.UseTemporaryFederatedCredentials) if (configuration.UseTemporaryFederatedCredentials)
{ {
return new AmazonS3Client(await GetTemporaryFederatedCredentialsAsync(configuration), return new AmazonS3Client(await GetTemporaryFederatedCredentialsAsync(configuration),
region); clientConfig);
} }
Check.NotNullOrWhiteSpace(configuration.AccessKeyId, nameof(configuration.AccessKeyId)); Check.NotNullOrWhiteSpace(configuration.AccessKeyId, nameof(configuration.AccessKeyId));
Check.NotNullOrWhiteSpace(configuration.SecretAccessKey, nameof(configuration.SecretAccessKey)); Check.NotNullOrWhiteSpace(configuration.SecretAccessKey, nameof(configuration.SecretAccessKey));
return new AmazonS3Client(configuration.AccessKeyId, configuration.SecretAccessKey, region); return new AmazonS3Client(configuration.AccessKeyId, configuration.SecretAccessKey, clientConfig);
}
protected virtual AmazonS3Config CreateS3ClientConfig(AwsBlobProviderConfiguration configuration, RegionEndpoint region)
{
var clientConfig = new AmazonS3Config
{
RegionEndpoint = region
};
if (!configuration.ServiceURL.IsNullOrWhiteSpace())
{
clientConfig.ServiceURL = configuration.ServiceURL;
clientConfig.ForcePathStyle = true; // Required for most S3-compatible services
}
return clientConfig;
} }
protected virtual AWSCredentials? GetAwsCredentials( protected virtual AWSCredentials? GetAwsCredentials(

Loading…
Cancel
Save