Browse Source

Add MinioBlobNamingNormalizer

pull/4688/head
nuck.tang 6 years ago
parent
commit
a547c6b038
  1. 8
      .gitignore
  2. 52
      framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobNamingNormalizer.cs
  3. 17
      framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobProvider.cs
  4. 18
      framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/AbpBlobStoringMinioTestModule.cs
  5. 57
      framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNamingNormalizerProvider_Tests.cs
  6. 5
      framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs

8
.gitignore

@ -304,11 +304,3 @@ modules/virtual-file-explorer/app/Volo.Abp.VirtualFileExplorer.DemoApp/Logs/
/templates/app/angular/package-lock.json /templates/app/angular/package-lock.json
/modules/client-simulation/demo/Volo.ClientSimulation.Demo/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

52
framework/src/Volo.Abp.BlobStoring.Minio/Volo/Abp/BlobStoring/Minio/MinioBlobNamingNormalizer.cs

@ -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;
}
}
}

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

@ -115,10 +115,6 @@ namespace Volo.Abp.BlobStoring.Minio
{ {
try 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); await client.StatObjectAsync(containerName, blobName);
} }
catch (Exception e) catch (Exception e)
@ -126,11 +122,9 @@ namespace Volo.Abp.BlobStoring.Minio
if (e is ObjectNotFoundException) if (e is ObjectNotFoundException)
{ {
return false; return false;
} }
else
{ throw;
throw e;
}
} }
return true; return true;
@ -143,10 +137,9 @@ namespace Volo.Abp.BlobStoring.Minio
{ {
var configuration = args.Configuration.GetMinioConfiguration(); var configuration = args.Configuration.GetMinioConfiguration();
//Minio bucket name must be lowercase
return configuration.BucketName.IsNullOrWhiteSpace() return configuration.BucketName.IsNullOrWhiteSpace()
? args.ContainerName.ToLower() ? args.ContainerName
: configuration.BucketName.ToLower(); : configuration.BucketName;
} }
} }
} }

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

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reactive.Linq;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Minio; 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); var minioClient = new MinioClient(_endPoint, _accessKey, _secretKey);
if (await minioClient.BucketExistsAsync(_randomContainerName)) if (await minioClient.BucketExistsAsync(_randomContainerName))
{ {
var observables =minioClient.ListObjectsAsync(_randomContainerName,null,true); var objects = await minioClient.ListObjectsAsync(_randomContainerName, null, true).ToList();
var objectNames = new List<string>();
IDisposable subscription = observables.Subscribe( foreach (var item in objects)
async item => await minioClient.RemoveObjectAsync(_randomContainerName, item.Key), {
async () => await minioClient.RemoveBucketAsync(_randomContainerName) await minioClient.RemoveObjectAsync(_randomContainerName, item.Key);
); }
await minioClient.RemoveBucketAsync(_randomContainerName);
} }
} }

57
framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/DefaultMinioBlobNamingNormalizerProvider_Tests.cs

@ -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);
}
}
}

5
framework/test/Volo.Abp.BlobStoring.Minio.Tests/Volo/Abp/BlobStoring/Minio/MinioBlobContainer_Tests.cs

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

Loading…
Cancel
Save