Browse Source

Merge pull request #1214 from colinin/fix-minio-file-path

fix: 修复minio文件路径错误
pull/1238/head
yx lin 1 year ago
committed by GitHub
parent
commit
fea695a380
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 6
      aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobNamingNormalizer.cs
  2. 20
      aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobProvider.cs
  3. 50
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs

6
aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobNamingNormalizer.cs

@ -1,5 +1,4 @@
using System; using Volo.Abp.BlobStoring;
using Volo.Abp.BlobStoring;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.BlobStoring.OssManagement; namespace LINGYUN.Abp.BlobStoring.OssManagement;
@ -13,8 +12,7 @@ public class OssManagementBlobNamingNormalizer : IBlobNamingNormalizer, ITransie
public virtual string NormalizeContainerName(string containerName) public virtual string NormalizeContainerName(string containerName)
{ {
// 尾部添加反斜杠 return NormalizeName(containerName);
return NormalizeName(containerName).EnsureEndsWith('/');
} }
protected virtual string NormalizeName(string name) protected virtual string NormalizeName(string name)

20
aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobProvider.cs

@ -26,10 +26,9 @@ public class OssManagementBlobProvider : BlobProviderBase, ITransientDependency
public override async Task<bool> DeleteAsync(BlobProviderDeleteArgs args) public override async Task<bool> DeleteAsync(BlobProviderDeleteArgs args)
{ {
var configuration = args.Configuration.GetOssManagementConfiguration();
await _ossObjectAppService.DeleteAsync(new GetOssObjectInput await _ossObjectAppService.DeleteAsync(new GetOssObjectInput
{ {
Bucket = configuration.Bucket, Bucket = args.ContainerName,
Path = GetOssPath(args), Path = GetOssPath(args),
Object = GetOssName(args), Object = GetOssName(args),
}); });
@ -38,10 +37,9 @@ public class OssManagementBlobProvider : BlobProviderBase, ITransientDependency
public override async Task<bool> ExistsAsync(BlobProviderExistsArgs args) public override async Task<bool> ExistsAsync(BlobProviderExistsArgs args)
{ {
var configuration = args.Configuration.GetOssManagementConfiguration();
var result = await _ossObjectAppService.ExistsAsync(new GetOssObjectInput var result = await _ossObjectAppService.ExistsAsync(new GetOssObjectInput
{ {
Bucket = configuration.Bucket, Bucket = args.ContainerName,
Path = GetOssPath(args), Path = GetOssPath(args),
Object = GetOssName(args), Object = GetOssName(args),
}); });
@ -50,10 +48,9 @@ public class OssManagementBlobProvider : BlobProviderBase, ITransientDependency
public override async Task<Stream> GetOrNullAsync(BlobProviderGetArgs args) public override async Task<Stream> GetOrNullAsync(BlobProviderGetArgs args)
{ {
var configuration = args.Configuration.GetOssManagementConfiguration();
var content = await _ossObjectAppService.GetAsync(new GetOssObjectInput var content = await _ossObjectAppService.GetAsync(new GetOssObjectInput
{ {
Bucket = configuration.Bucket, Bucket = args.ContainerName,
Path = GetOssPath(args), Path = GetOssPath(args),
Object = GetOssName(args), Object = GetOssName(args),
}); });
@ -63,10 +60,9 @@ public class OssManagementBlobProvider : BlobProviderBase, ITransientDependency
public override async Task SaveAsync(BlobProviderSaveArgs args) public override async Task SaveAsync(BlobProviderSaveArgs args)
{ {
var configuration = args.Configuration.GetOssManagementConfiguration();
await _ossObjectAppService.CreateAsync(new CreateOssObjectInput await _ossObjectAppService.CreateAsync(new CreateOssObjectInput
{ {
Bucket = configuration.Bucket, Bucket = args.ContainerName,
Overwrite = args.OverrideExisting, Overwrite = args.OverrideExisting,
Path = GetOssPath(args), Path = GetOssPath(args),
FileName = GetOssName(args), FileName = GetOssName(args),
@ -76,16 +72,14 @@ public class OssManagementBlobProvider : BlobProviderBase, ITransientDependency
protected virtual string GetOssPath(BlobProviderArgs args) protected virtual string GetOssPath(BlobProviderArgs args)
{ {
// ContainerName: blob // path1/path2/path3/path3/path5/file.txt => path1/path2/path3/path3/path5/
// path1/path2/path3/path3/path5/file.txt => blob/path1/path2/path3/path3/path5/
var path = args.ContainerName;
if (args.BlobName.Contains("/")) if (args.BlobName.Contains("/"))
{ {
var lastIndex = args.BlobName.LastIndexOf('/'); var lastIndex = args.BlobName.LastIndexOf('/');
path += args.BlobName.Substring(0, lastIndex); return args.BlobName.Substring(0, lastIndex);
} }
return path.EnsureEndsWith('/'); return args.BlobName.EnsureEndsWith('/');
} }
protected virtual string GetOssName(BlobProviderArgs args) protected virtual string GetOssName(BlobProviderArgs args)

50
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs

@ -119,6 +119,7 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor
var objectName = objectPath.IsNullOrWhiteSpace() var objectName = objectPath.IsNullOrWhiteSpace()
? request.Object ? request.Object
: objectPath + request.Object; : objectPath + request.Object;
var isDir = false;
if (!request.Overwrite && await ObjectExists(client, bucket, objectName)) if (!request.Overwrite && await ObjectExists(client, bucket, objectName))
{ {
@ -137,12 +138,13 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor
} }
if (request.Content.IsNullOrEmpty()) if (request.Content.IsNullOrEmpty())
{ {
isDir = true;
var emptyContent = "This is an OSS object that simulates a directory.".GetBytes(); var emptyContent = "This is an OSS object that simulates a directory.".GetBytes();
request.SetContent(new MemoryStream(emptyContent)); request.SetContent(new MemoryStream(emptyContent));
} }
var putResponse = await client.PutObjectAsync(new PutObjectArgs() var putResponse = await client.PutObjectAsync(new PutObjectArgs()
.WithBucket(bucket) .WithBucket(bucket)
.WithObject(objectName) .WithObject(isDir ? $"{objectName}/_dir" : objectName)
.WithStreamData(request.Content) .WithStreamData(request.Content)
.WithObjectSize(request.Content.Length)); .WithObjectSize(request.Content.Length));
@ -190,13 +192,6 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor
public async override Task DeleteObjectAsync(GetOssObjectRequest request) public async override Task DeleteObjectAsync(GetOssObjectRequest request)
{ {
if (request.Object.EndsWith('/'))
{
// Minio系统设计并不支持目录的形式
// 如果是目录的形式,那必定有文件存在,抛出目录不为空即可
throw new BusinessException(code: OssManagementErrorCodes.ObjectDeleteWithNotEmpty);
}
var client = GetMinioClient(); var client = GetMinioClient();
var bucket = GetBucket(request.Bucket); var bucket = GetBucket(request.Bucket);
@ -207,8 +202,34 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor
? request.Object ? request.Object
: objectPath + request.Object; : objectPath + request.Object;
if (await BucketExists(client, bucket) && if (objectName.EndsWith('/') && await BucketExists(client, bucket))
await ObjectExists(client, bucket, objectName)) {
var objectNames = new List<string>();
var objects = client.ListObjectsEnumAsync(
new ListObjectsArgs()
.WithBucket(bucket)
.WithPrefix(objectName)
.WithRecursive(true));
await foreach (var @object in objects)
{
objectNames.Add(@object.Key);
}
var errors = await client.RemoveObjectsAsync(
new RemoveObjectsArgs()
.WithBucket(bucket)
.WithObjects(objectNames));
foreach (var error in errors)
{
Logger.LogWarning("Batch deletion of objects failed, error details {code}: {message}", error.Code, error.Message);
}
return;
}
if (await ObjectExists(client, bucket, objectName))
{ {
var removeObjectArgs = new RemoveObjectArgs() var removeObjectArgs = new RemoveObjectArgs()
.WithBucket(bucket) .WithBucket(bucket)
@ -335,6 +356,11 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor
await foreach (var item in listObjectResult) await foreach (var item in listObjectResult)
{ {
// 作为目录占位,无需显示
if (item.Key.EndsWith("_dir"))
{
continue;
}
resultObjects.Add(new OssObject( resultObjects.Add(new OssObject(
!objectPath.IsNullOrWhiteSpace() !objectPath.IsNullOrWhiteSpace()
? item.Key.Replace(objectPath, "") ? item.Key.Replace(objectPath, "")
@ -407,7 +433,7 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor
var objectPath = GetBlobPath(prefixPath, request.Path); var objectPath = GetBlobPath(prefixPath, request.Path);
var objectName = objectPath.IsNullOrWhiteSpace() var objectName = objectPath.IsNullOrWhiteSpace()
? request.Object ? request.Object
: objectPath.EnsureEndsWith('/') + request.Object; : objectPath + request.Object;
if (!await ObjectExists(client, bucket, objectName)) if (!await ObjectExists(client, bucket, objectName))
{ {
@ -535,6 +561,6 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor
path.IsNullOrWhiteSpace() ? "" : path.IsNullOrWhiteSpace() ? "" :
path.Replace("./", "").RemovePreFix("/"))}"; path.Replace("./", "").RemovePreFix("/"))}";
return resultPath.Replace("//", ""); return resultPath.Replace("//", "").EnsureEndsWith('/');
} }
} }

Loading…
Cancel
Save