Add MinioBlobNamingNormalizer

pull/4688/head
nuck.tang 5 years ago
parent 18b69b71ab
commit a547c6b038

8
.gitignore vendored

@ -304,11 +304,3 @@ modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Logs/
/templates/app/angular/package-lock.json
/modules/client-simulation/demo/Volo.ClientSimulation.Demo/package-lock.json
/framework/src/Volo.Abp.AspNetCore/Properties/launchSettings.json
/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Properties/launchSettings.json
/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Properties/launchSettings.json
/framework/src/Volo.Abp.AspNetCore.Mvc.Client/Properties/launchSettings.json
/framework/src/Volo.Abp.AspNetCore.Serilog/Properties/launchSettings.json
/framework/src/Volo.Abp.AspNetCore.SignalR/Properties/launchSettings.json
/framework/src/Volo.Abp.AspNetCore.TestBase/Properties/launchSettings.json
/framework/src/Volo.Abp.Http.Client.IdentityModel.Web/Properties/launchSettings.json

@ -0,0 +1,52 @@
using System.Text.RegularExpressions;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.BlobStoring.Minio
{
public class MinioBlobNamingNormalizer : IBlobNamingNormalizer, ITransientDependency
{
/// <summary>
///https://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html
/// </summary>
public virtual string NormalizeContainerName(string containerName)
{
// All letters in a container name must be lowercase.
containerName = containerName.ToLower();
// Container names can contain only letters, numbers, and the dash (-) character.
containerName = Regex.Replace(containerName, "[^a-z0-9-]", string.Empty);
// Every dash (-) character must be immediately preceded and followed by a letter or number;
// consecutive dashes are not permitted in container names.
// Container names must start or end with a letter or number
containerName = Regex.Replace(containerName, "-{2,}", "-");
containerName = Regex.Replace(containerName, "^-", string.Empty);
containerName = Regex.Replace(containerName, "-$", string.Empty);
// Container names must be from 3 through 63 characters long.
if (containerName.Length < 3)
{
var length = containerName.Length;
for (var i = 0; i < 3 - length; i++)
{
containerName += "0";
}
}
if (containerName.Length > 63)
{
containerName = containerName.Substring(0, 63);
}
return containerName;
}
/// <summary>
/// https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
/// </summary>
public virtual string NormalizeBlobName(string blobName)
{
return blobName;
}
}
}

@ -115,10 +115,6 @@ namespace Volo.Abp.BlobStoring.Minio
{
try
{
// Check whether the object exists using statObject().
// If the object is not found, statObject() throws an exception,
// else it means that the object exists.
// Execution is successful.
await client.StatObjectAsync(containerName, blobName);
}
catch (Exception e)
@ -126,11 +122,9 @@ namespace Volo.Abp.BlobStoring.Minio
if (e is ObjectNotFoundException)
{
return false;
}
else
{
throw e;
}
}
throw;
}
return true;
@ -143,10 +137,9 @@ namespace Volo.Abp.BlobStoring.Minio
{
var configuration = args.Configuration.GetMinioConfiguration();
//Minio bucket name must be lowercase
return configuration.BucketName.IsNullOrWhiteSpace()
? args.ContainerName.ToLower()
: configuration.BucketName.ToLower();
? args.ContainerName
: configuration.BucketName;
}
}
}

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Minio;
@ -59,18 +60,19 @@ namespace Volo.Abp.BlobStoring.Minio
});
}
public async override void OnApplicationShutdown(ApplicationShutdownContext context)
public override async void OnApplicationShutdown(ApplicationShutdownContext context)
{
var minioClient = new MinioClient(_endPoint, _accessKey, _secretKey);
if (await minioClient.BucketExistsAsync(_randomContainerName))
{
var observables =minioClient.ListObjectsAsync(_randomContainerName,null,true);
var objectNames = new List<string>();
IDisposable subscription = observables.Subscribe(
async item => await minioClient.RemoveObjectAsync(_randomContainerName, item.Key),
async () => await minioClient.RemoveBucketAsync(_randomContainerName)
);
var objects = await minioClient.ListObjectsAsync(_randomContainerName, null, true).ToList();
foreach (var item in objects)
{
await minioClient.RemoveObjectAsync(_randomContainerName, item.Key);
}
await minioClient.RemoveBucketAsync(_randomContainerName);
}
}

@ -0,0 +1,57 @@
using Shouldly;
using Xunit;
namespace Volo.Abp.BlobStoring.Minio
{
public class DefaultMinioBlobNamingNormalizerProvider_Tests : AbpBlobStoringMinioTestCommonBase
{
private readonly IBlobNamingNormalizer _blobNamingNormalizer;
public DefaultMinioBlobNamingNormalizerProvider_Tests()
{
_blobNamingNormalizer = GetRequiredService<IBlobNamingNormalizer>();
}
[Fact]
public void NormalizeContainerName_Lowercase()
{
var filename = "ThisIsMyContainerName";
filename = _blobNamingNormalizer.NormalizeContainerName(filename);
filename.ShouldBe("thisismycontainername");
}
[Fact]
public void NormalizeContainerName_Only_Letters_Numbers_Dash()
{
var filename = ",./this-i,./s-my-c,./ont,./ai+*/.=!@#$n^&*er-name.+/";
filename = _blobNamingNormalizer.NormalizeContainerName(filename);
filename.ShouldBe("this-is-my-container-name");
}
[Fact]
public void NormalizeContainerName_Dash()
{
var filename = "-this--is----my-container----name-";
filename = _blobNamingNormalizer.NormalizeContainerName(filename);
filename.ShouldBe("this-is-my-container-name");
}
[Fact]
public void NormalizeContainerName_Min_Length()
{
var filename = "a";
filename = _blobNamingNormalizer.NormalizeContainerName(filename);
filename.Length.ShouldBeGreaterThanOrEqualTo(3);
}
[Fact]
public void NormalizeContainerName_Max_Length()
{
var filename = "abpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabp";
filename = _blobNamingNormalizer.NormalizeContainerName(filename);
filename.Length.ShouldBeLessThanOrEqualTo(63);
}
}
}

@ -2,7 +2,7 @@
namespace Volo.Abp.BlobStoring.Minio
{
/*
//Please set the correct connection string in secrets.json and continue the test.
public class MinioBlobContainer_Tests : BlobContainer_Tests<AbpBlobStoringMinioTestModule>
@ -10,7 +10,8 @@ namespace Volo.Abp.BlobStoring.Minio
public MinioBlobContainer_Tests()
{
}
}
*/
}

Loading…
Cancel
Save