From 8f7f80907c704457dcd377a9b205707e8a3b6f8f Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sat, 23 Oct 2021 15:49:50 +0800 Subject: [PATCH] fix(oss): fix local file system paging control parameters --- .../Aliyun/AliyunOssContainer.cs | 3 + .../OssManagement/OssContainerAppService.cs | 140 +++++++-------- .../OssManagement/GetOssContainersRequest.cs | 39 +++-- .../Abp/OssManagement/GetOssObjectsRequest.cs | 67 ++++---- .../OssManagement/IOssContainerExtensions.cs | 160 +++++++++--------- .../FileSystem/FileSystemOssContainer.cs | 84 ++++----- 6 files changed, 244 insertions(+), 249 deletions(-) diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs index 9e38b00c8..88becc522 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs @@ -239,6 +239,7 @@ namespace LINGYUN.Abp.OssManagement.Aliyun { var ossClient = await CreateClientAsync(); + // TODO: 阿里云的分页差异需要前端来弥补,传递Marker, 按照Oss控制台的逻辑,直接把MaxKeys设置较大值就行了 var aliyunRequest = new ListBucketsRequest { Marker = request.Marker, @@ -275,6 +276,8 @@ namespace LINGYUN.Abp.OssManagement.Aliyun var marker = !objectPath.IsNullOrWhiteSpace() && !request.Marker.IsNullOrWhiteSpace() ? request.Marker.Replace(objectPath, "") : request.Marker; + + // TODO: 阿里云的分页差异需要前端来弥补,传递Marker, 按照Oss控制台的逻辑,直接把MaxKeys设置较大值就行了 var aliyunRequest = new ListObjectsRequest(request.BucketName) { Marker = !marker.IsNullOrWhiteSpace() ? objectPath + marker : marker, diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs index a51a72472..c33c9c504 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs @@ -1,70 +1,70 @@ -using LINGYUN.Abp.OssManagement.Permissions; -using Microsoft.AspNetCore.Authorization; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.OssManagement -{ - [Authorize(AbpOssManagementPermissions.Container.Default)] - public class OssContainerAppService : OssManagementApplicationServiceBase, IOssContainerAppService - { - protected IOssContainerFactory OssContainerFactory { get; } - - public OssContainerAppService( - IOssContainerFactory ossContainerFactory) - { - OssContainerFactory = ossContainerFactory; - } - - [Authorize(AbpOssManagementPermissions.Container.Create)] - public virtual async Task CreateAsync(string name) - { - var oss = CreateOssContainer(); - var container = await oss.CreateAsync(name); - - return ObjectMapper.Map(container); - } - - [Authorize(AbpOssManagementPermissions.Container.Delete)] - public virtual async Task DeleteAsync(string name) - { - var oss = CreateOssContainer(); - - await oss.DeleteAsync(name); - } - - public virtual async Task GetAsync(string name) - { - var oss = CreateOssContainer(); - var container = await oss.GetAsync(name); - - return ObjectMapper.Map(container); - } - - public virtual async Task GetListAsync(GetOssContainersInput input) - { - var oss = CreateOssContainer(); - - var containerResponse = await oss.GetListAsync( - input.Prefix, input.Marker, input.MaxResultCount); - - return ObjectMapper.Map(containerResponse); - } - - public virtual async Task GetObjectListAsync(GetOssObjectsInput input) - { - var oss = CreateOssContainer(); - - var ossObjectResponse = await oss.GetObjectsAsync( - input.Bucket, input.Prefix, input.Marker, - input.Delimiter, input.EncodingType, - input.MaxResultCount); - - return ObjectMapper.Map(ossObjectResponse); - } - - protected virtual IOssContainer CreateOssContainer() - { - return OssContainerFactory.Create(); - } - } -} +using LINGYUN.Abp.OssManagement.Permissions; +using Microsoft.AspNetCore.Authorization; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.OssManagement +{ + [Authorize(AbpOssManagementPermissions.Container.Default)] + public class OssContainerAppService : OssManagementApplicationServiceBase, IOssContainerAppService + { + protected IOssContainerFactory OssContainerFactory { get; } + + public OssContainerAppService( + IOssContainerFactory ossContainerFactory) + { + OssContainerFactory = ossContainerFactory; + } + + [Authorize(AbpOssManagementPermissions.Container.Create)] + public virtual async Task CreateAsync(string name) + { + var oss = CreateOssContainer(); + var container = await oss.CreateAsync(name); + + return ObjectMapper.Map(container); + } + + [Authorize(AbpOssManagementPermissions.Container.Delete)] + public virtual async Task DeleteAsync(string name) + { + var oss = CreateOssContainer(); + + await oss.DeleteAsync(name); + } + + public virtual async Task GetAsync(string name) + { + var oss = CreateOssContainer(); + var container = await oss.GetAsync(name); + + return ObjectMapper.Map(container); + } + + public virtual async Task GetListAsync(GetOssContainersInput input) + { + var oss = CreateOssContainer(); + + var containerResponse = await oss.GetListAsync( + input.Prefix, input.Marker, input.SkipCount, input.MaxResultCount); + + return ObjectMapper.Map(containerResponse); + } + + public virtual async Task GetObjectListAsync(GetOssObjectsInput input) + { + var oss = CreateOssContainer(); + + var ossObjectResponse = await oss.GetObjectsAsync( + input.Bucket, input.Prefix, input.Marker, + input.Delimiter, input.EncodingType, + input.SkipCount, input.MaxResultCount); + + return ObjectMapper.Map(ossObjectResponse); + } + + protected virtual IOssContainer CreateOssContainer() + { + return OssContainerFactory.Create(); + } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssContainersRequest.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssContainersRequest.cs index c89fa3764..b1c57fe09 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssContainersRequest.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssContainersRequest.cs @@ -1,18 +1,21 @@ -namespace LINGYUN.Abp.OssManagement -{ - public class GetOssContainersRequest - { - public string Prefix { get; } - public string Marker { get; } - public int? MaxKeys { get; } - public GetOssContainersRequest( - string prefix = null, - string marker = null, - int? maxKeys = 10) - { - Prefix = prefix; - Marker = marker; - MaxKeys = maxKeys; - } - } -} +namespace LINGYUN.Abp.OssManagement +{ + public class GetOssContainersRequest + { + public string Prefix { get; } + public string Marker { get; } + public int Current { get; } + public int? MaxKeys { get; } + public GetOssContainersRequest( + string prefix = null, + string marker = null, + int current = 0, + int? maxKeys = 10) + { + Prefix = prefix; + Marker = marker; + Current = current; + MaxKeys = maxKeys; + } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs index 725b67c92..8ca89466b 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs @@ -1,32 +1,35 @@ -using JetBrains.Annotations; -using Volo.Abp; - -namespace LINGYUN.Abp.OssManagement -{ - public class GetOssObjectsRequest - { - public string BucketName { get; } - public string Prefix { get; } - public string Delimiter { get; } - public string Marker { get; } - public string EncodingType { get; } - public int? MaxKeys { get; } - public GetOssObjectsRequest( - [NotNull] string bucketName, - string prefix = null, - string marker = null, - string delimiter = null, - string encodingType = null, - int maxKeys = 10) - { - Check.NotNullOrWhiteSpace(bucketName, nameof(bucketName)); - - BucketName = bucketName; - Prefix = prefix; - Marker = marker; - Delimiter = delimiter; - EncodingType = encodingType; - MaxKeys = maxKeys; - } - } -} +using JetBrains.Annotations; +using Volo.Abp; + +namespace LINGYUN.Abp.OssManagement +{ + public class GetOssObjectsRequest + { + public string BucketName { get; } + public string Prefix { get; } + public string Delimiter { get; } + public string Marker { get; } + public string EncodingType { get; } + public int Current { get; } + public int? MaxKeys { get; } + public GetOssObjectsRequest( + [NotNull] string bucketName, + string prefix = null, + string marker = null, + string delimiter = null, + string encodingType = null, + int current = 0, + int maxKeys = 10) + { + Check.NotNullOrWhiteSpace(bucketName, nameof(bucketName)); + + BucketName = bucketName; + Prefix = prefix; + Marker = marker; + Delimiter = delimiter; + EncodingType = encodingType; + Current = current; + MaxKeys = maxKeys; + } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs index 9bee73fba..f19702fc1 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs @@ -1,79 +1,81 @@ -using System.Collections.Generic; -using System.Threading.Tasks; - -namespace LINGYUN.Abp.OssManagement -{ - public static class IOssContainerExtensions - { - /// - /// 如果不存在容器则创建 - /// - /// - /// - /// 返回容器信息 - public static async Task CreateIfNotExistsAsync( - this IOssContainer ossContainer, - string name) - { - if (! await ossContainer.ExistsAsync(name)) - { - await ossContainer.CreateAsync(name); - } - - return await ossContainer.GetAsync(name); - } - - public static async Task DeleteObjectAsync( - this IOssContainer ossContainer, - string bucket, - string @object, - string path = "") - { - await ossContainer.DeleteObjectAsync( - new GetOssObjectRequest(bucket, @object, path)); - } - - public static async Task BulkDeleteObjectsAsync( - this IOssContainer ossContainer, - string bucketName, - ICollection objectNames, - string path = "") - { - await ossContainer.BulkDeleteObjectsAsync( - new BulkDeleteObjectRequest(bucketName, objectNames, path)); - } - - public static async Task GetListAsync( - this IOssContainer ossContainer, - string prefix = null, - string marker = null, - int maxResultCount = 10) - { - return await ossContainer.GetListAsync( - new GetOssContainersRequest(prefix, marker, maxResultCount)); - } - - public static async Task GetObjectAsync( - this IOssContainer ossContainer, - string bucket, - string @object, - string path = "") - { - return await ossContainer.GetObjectAsync( - new GetOssObjectRequest(bucket, @object, path)); - } - - public static async Task GetObjectsAsync( - this IOssContainer ossContainer, - string name, - string prefix = null, - string marker = null, - string delimiter = null, - string encodingType = null, - int maxResultCount = 10) - { - return await ossContainer.GetObjectsAsync( - new GetOssObjectsRequest(name, prefix, marker, delimiter, encodingType, maxResultCount)); - } - } -} +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.OssManagement +{ + public static class IOssContainerExtensions + { + /// + /// 如果不存在容器则创建 + /// + /// + /// + /// 返回容器信息 + public static async Task CreateIfNotExistsAsync( + this IOssContainer ossContainer, + string name) + { + if (! await ossContainer.ExistsAsync(name)) + { + await ossContainer.CreateAsync(name); + } + + return await ossContainer.GetAsync(name); + } + + public static async Task DeleteObjectAsync( + this IOssContainer ossContainer, + string bucket, + string @object, + string path = "") + { + await ossContainer.DeleteObjectAsync( + new GetOssObjectRequest(bucket, @object, path)); + } + + public static async Task BulkDeleteObjectsAsync( + this IOssContainer ossContainer, + string bucketName, + ICollection objectNames, + string path = "") + { + await ossContainer.BulkDeleteObjectsAsync( + new BulkDeleteObjectRequest(bucketName, objectNames, path)); + } + + public static async Task GetListAsync( + this IOssContainer ossContainer, + string prefix = null, + string marker = null, + int skipCount = 0, + int maxResultCount = 10) + { + return await ossContainer.GetListAsync( + new GetOssContainersRequest(prefix, marker, skipCount, maxResultCount)); + } + + public static async Task GetObjectAsync( + this IOssContainer ossContainer, + string bucket, + string @object, + string path = "") + { + return await ossContainer.GetObjectAsync( + new GetOssObjectRequest(bucket, @object, path)); + } + + public static async Task GetObjectsAsync( + this IOssContainer ossContainer, + string name, + string prefix = null, + string marker = null, + string delimiter = null, + string encodingType = null, + int skipCount = 0, + int maxResultCount = 10) + { + return await ossContainer.GetObjectsAsync( + new GetOssObjectsRequest(name, prefix, marker, delimiter, encodingType, skipCount, maxResultCount)); + } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs index 1f428c09a..05c42be26 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs @@ -337,30 +337,11 @@ namespace LINGYUN.Abp.OssManagement.FileSystem { return x.CompareTo(y); }); - - - // 需要计算从哪个位置截断 - int markIndex = 0; - if (!request.Marker.IsNullOrWhiteSpace()) - { - markIndex = directories.FindIndex(x => x.EndsWith(request.Marker)); - if (markIndex < 0) - { - markIndex = 0; - } - } - - var spiltDirectories = directories; - - if (markIndex > 0) - { - spiltDirectories = directories[markIndex..]; - } - // 截取指定数量的目录 - int maxResultCount = request.MaxKeys ?? 10; // 容器对应的目录信息集合 - var directoryInfos = spiltDirectories - .Take(maxResultCount) + // 本地文件系统直接用PageBy即可 + var directoryInfos = directories + .AsQueryable() + .PageBy(request.Current, request.MaxKeys ?? 10) .Select(file => new DirectoryInfo(file)) .ToArray(); var nextMarkerIndex = directories.FindIndex(x => x.EndsWith(directoryInfos[directoryInfos.Length - 1].Name)); @@ -431,38 +412,41 @@ namespace LINGYUN.Abp.OssManagement.FileSystem return x.CompareTo(y); }); - // 需要计算从哪个位置截断 - int markIndex = 0; - if (!request.Marker.IsNullOrWhiteSpace()) + //// 需要计算从哪个位置截断 + //int markIndex = 0; + //if (!request.Marker.IsNullOrWhiteSpace()) + //{ + // markIndex = fileSystemNames.FindIndex(x => x.EndsWith(request.Marker)); + // if (markIndex < 0) + // { + // markIndex = 0; + // } + //} + + //// 需要截断Oss对象列表 + //var copyFileSystemNames = fileSystemNames; + //if (markIndex > 0) + //{ + // // fix: 翻页查询数组可能引起下标越界 + // // copyFileSystemNames = fileSystemNames[(markIndex+1)..]; + // copyFileSystemNames = fileSystemNames[markIndex..]; + //} + // Oss对象信息集合 + + static FileSystemInfo ConvertFileSystem(string path) { - markIndex = fileSystemNames.FindIndex(x => x.EndsWith(request.Marker)); - if (markIndex < 0) + if (File.Exists(path)) { - markIndex = 0; + return new FileInfo(path); } - } - // 需要截断Oss对象列表 - var copyFileSystemNames = fileSystemNames; - if (markIndex > 0) - { - // fix: 翻页查询数组可能引起下标越界 - // copyFileSystemNames = fileSystemNames[(markIndex+1)..]; - copyFileSystemNames = fileSystemNames[markIndex..]; + return new DirectoryInfo(path); } - // 截取指定数量的Oss对象 - int maxResultCount = request.MaxKeys ?? 10; - // Oss对象信息集合 - var fileSystems = copyFileSystemNames - .Take(maxResultCount) - .Select(file => - { - if (File.Exists(file)) - { - return new FileInfo(file); - } - return new DirectoryInfo(file); - }) + + var fileSystems = fileSystemNames + .AsQueryable() + .PageBy(request.Current, request.MaxKeys ?? 10) + .Select(ConvertFileSystem) .ToArray(); // 计算下一页起始标记文件/目录名称