Browse Source

fix(oss): fix local file system paging control parameters

pull/334/head
cKey 4 years ago
parent
commit
8f7f80907c
  1. 3
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Aliyun/LINGYUN/Abp/OssManagement/Aliyun/AliyunOssContainer.cs
  2. 140
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs
  3. 39
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssContainersRequest.cs
  4. 67
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs
  5. 160
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs
  6. 84
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.FileSystem/LINGYUN/Abp/OssManagement/FileSystem/FileSystemOssContainer.cs

3
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(); var ossClient = await CreateClientAsync();
// TODO: 阿里云的分页差异需要前端来弥补,传递Marker, 按照Oss控制台的逻辑,直接把MaxKeys设置较大值就行了
var aliyunRequest = new ListBucketsRequest var aliyunRequest = new ListBucketsRequest
{ {
Marker = request.Marker, Marker = request.Marker,
@ -275,6 +276,8 @@ namespace LINGYUN.Abp.OssManagement.Aliyun
var marker = !objectPath.IsNullOrWhiteSpace() && !request.Marker.IsNullOrWhiteSpace() var marker = !objectPath.IsNullOrWhiteSpace() && !request.Marker.IsNullOrWhiteSpace()
? request.Marker.Replace(objectPath, "") ? request.Marker.Replace(objectPath, "")
: request.Marker; : request.Marker;
// TODO: 阿里云的分页差异需要前端来弥补,传递Marker, 按照Oss控制台的逻辑,直接把MaxKeys设置较大值就行了
var aliyunRequest = new ListObjectsRequest(request.BucketName) var aliyunRequest = new ListObjectsRequest(request.BucketName)
{ {
Marker = !marker.IsNullOrWhiteSpace() ? objectPath + marker : marker, Marker = !marker.IsNullOrWhiteSpace() ? objectPath + marker : marker,

140
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssContainerAppService.cs

@ -1,70 +1,70 @@
using LINGYUN.Abp.OssManagement.Permissions; using LINGYUN.Abp.OssManagement.Permissions;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
[Authorize(AbpOssManagementPermissions.Container.Default)] [Authorize(AbpOssManagementPermissions.Container.Default)]
public class OssContainerAppService : OssManagementApplicationServiceBase, IOssContainerAppService public class OssContainerAppService : OssManagementApplicationServiceBase, IOssContainerAppService
{ {
protected IOssContainerFactory OssContainerFactory { get; } protected IOssContainerFactory OssContainerFactory { get; }
public OssContainerAppService( public OssContainerAppService(
IOssContainerFactory ossContainerFactory) IOssContainerFactory ossContainerFactory)
{ {
OssContainerFactory = ossContainerFactory; OssContainerFactory = ossContainerFactory;
} }
[Authorize(AbpOssManagementPermissions.Container.Create)] [Authorize(AbpOssManagementPermissions.Container.Create)]
public virtual async Task<OssContainerDto> CreateAsync(string name) public virtual async Task<OssContainerDto> CreateAsync(string name)
{ {
var oss = CreateOssContainer(); var oss = CreateOssContainer();
var container = await oss.CreateAsync(name); var container = await oss.CreateAsync(name);
return ObjectMapper.Map<OssContainer, OssContainerDto>(container); return ObjectMapper.Map<OssContainer, OssContainerDto>(container);
} }
[Authorize(AbpOssManagementPermissions.Container.Delete)] [Authorize(AbpOssManagementPermissions.Container.Delete)]
public virtual async Task DeleteAsync(string name) public virtual async Task DeleteAsync(string name)
{ {
var oss = CreateOssContainer(); var oss = CreateOssContainer();
await oss.DeleteAsync(name); await oss.DeleteAsync(name);
} }
public virtual async Task<OssContainerDto> GetAsync(string name) public virtual async Task<OssContainerDto> GetAsync(string name)
{ {
var oss = CreateOssContainer(); var oss = CreateOssContainer();
var container = await oss.GetAsync(name); var container = await oss.GetAsync(name);
return ObjectMapper.Map<OssContainer, OssContainerDto>(container); return ObjectMapper.Map<OssContainer, OssContainerDto>(container);
} }
public virtual async Task<OssContainersResultDto> GetListAsync(GetOssContainersInput input) public virtual async Task<OssContainersResultDto> GetListAsync(GetOssContainersInput input)
{ {
var oss = CreateOssContainer(); var oss = CreateOssContainer();
var containerResponse = await oss.GetListAsync( var containerResponse = await oss.GetListAsync(
input.Prefix, input.Marker, input.MaxResultCount); input.Prefix, input.Marker, input.SkipCount, input.MaxResultCount);
return ObjectMapper.Map<GetOssContainersResponse, OssContainersResultDto>(containerResponse); return ObjectMapper.Map<GetOssContainersResponse, OssContainersResultDto>(containerResponse);
} }
public virtual async Task<OssObjectsResultDto> GetObjectListAsync(GetOssObjectsInput input) public virtual async Task<OssObjectsResultDto> GetObjectListAsync(GetOssObjectsInput input)
{ {
var oss = CreateOssContainer(); var oss = CreateOssContainer();
var ossObjectResponse = await oss.GetObjectsAsync( var ossObjectResponse = await oss.GetObjectsAsync(
input.Bucket, input.Prefix, input.Marker, input.Bucket, input.Prefix, input.Marker,
input.Delimiter, input.EncodingType, input.Delimiter, input.EncodingType,
input.MaxResultCount); input.SkipCount, input.MaxResultCount);
return ObjectMapper.Map<GetOssObjectsResponse, OssObjectsResultDto>(ossObjectResponse); return ObjectMapper.Map<GetOssObjectsResponse, OssObjectsResultDto>(ossObjectResponse);
} }
protected virtual IOssContainer CreateOssContainer() protected virtual IOssContainer CreateOssContainer()
{ {
return OssContainerFactory.Create(); return OssContainerFactory.Create();
} }
} }
} }

39
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssContainersRequest.cs

@ -1,18 +1,21 @@
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class GetOssContainersRequest public class GetOssContainersRequest
{ {
public string Prefix { get; } public string Prefix { get; }
public string Marker { get; } public string Marker { get; }
public int? MaxKeys { get; } public int Current { get; }
public GetOssContainersRequest( public int? MaxKeys { get; }
string prefix = null, public GetOssContainersRequest(
string marker = null, string prefix = null,
int? maxKeys = 10) string marker = null,
{ int current = 0,
Prefix = prefix; int? maxKeys = 10)
Marker = marker; {
MaxKeys = maxKeys; Prefix = prefix;
} Marker = marker;
} Current = current;
} MaxKeys = maxKeys;
}
}
}

67
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/GetOssObjectsRequest.cs

@ -1,32 +1,35 @@
using JetBrains.Annotations; using JetBrains.Annotations;
using Volo.Abp; using Volo.Abp;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public class GetOssObjectsRequest public class GetOssObjectsRequest
{ {
public string BucketName { get; } public string BucketName { get; }
public string Prefix { get; } public string Prefix { get; }
public string Delimiter { get; } public string Delimiter { get; }
public string Marker { get; } public string Marker { get; }
public string EncodingType { get; } public string EncodingType { get; }
public int? MaxKeys { get; } public int Current { get; }
public GetOssObjectsRequest( public int? MaxKeys { get; }
[NotNull] string bucketName, public GetOssObjectsRequest(
string prefix = null, [NotNull] string bucketName,
string marker = null, string prefix = null,
string delimiter = null, string marker = null,
string encodingType = null, string delimiter = null,
int maxKeys = 10) string encodingType = null,
{ int current = 0,
Check.NotNullOrWhiteSpace(bucketName, nameof(bucketName)); int maxKeys = 10)
{
BucketName = bucketName; Check.NotNullOrWhiteSpace(bucketName, nameof(bucketName));
Prefix = prefix;
Marker = marker; BucketName = bucketName;
Delimiter = delimiter; Prefix = prefix;
EncodingType = encodingType; Marker = marker;
MaxKeys = maxKeys; Delimiter = delimiter;
} EncodingType = encodingType;
} Current = current;
} MaxKeys = maxKeys;
}
}
}

160
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainerExtensions.cs

@ -1,79 +1,81 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace LINGYUN.Abp.OssManagement namespace LINGYUN.Abp.OssManagement
{ {
public static class IOssContainerExtensions public static class IOssContainerExtensions
{ {
/// <summary> /// <summary>
/// 如果不存在容器则创建 /// 如果不存在容器则创建
/// </summary> /// </summary>
/// <param name="ossContainer"></param> /// <param name="ossContainer"></param>
/// <param name="name"></param> /// <param name="name"></param>
/// <returns>返回容器信息</returns> /// <returns>返回容器信息</returns>
public static async Task<OssContainer> CreateIfNotExistsAsync( public static async Task<OssContainer> CreateIfNotExistsAsync(
this IOssContainer ossContainer, this IOssContainer ossContainer,
string name) string name)
{ {
if (! await ossContainer.ExistsAsync(name)) if (! await ossContainer.ExistsAsync(name))
{ {
await ossContainer.CreateAsync(name); await ossContainer.CreateAsync(name);
} }
return await ossContainer.GetAsync(name); return await ossContainer.GetAsync(name);
} }
public static async Task DeleteObjectAsync( public static async Task DeleteObjectAsync(
this IOssContainer ossContainer, this IOssContainer ossContainer,
string bucket, string bucket,
string @object, string @object,
string path = "") string path = "")
{ {
await ossContainer.DeleteObjectAsync( await ossContainer.DeleteObjectAsync(
new GetOssObjectRequest(bucket, @object, path)); new GetOssObjectRequest(bucket, @object, path));
} }
public static async Task BulkDeleteObjectsAsync( public static async Task BulkDeleteObjectsAsync(
this IOssContainer ossContainer, this IOssContainer ossContainer,
string bucketName, string bucketName,
ICollection<string> objectNames, ICollection<string> objectNames,
string path = "") string path = "")
{ {
await ossContainer.BulkDeleteObjectsAsync( await ossContainer.BulkDeleteObjectsAsync(
new BulkDeleteObjectRequest(bucketName, objectNames, path)); new BulkDeleteObjectRequest(bucketName, objectNames, path));
} }
public static async Task<GetOssContainersResponse> GetListAsync( public static async Task<GetOssContainersResponse> GetListAsync(
this IOssContainer ossContainer, this IOssContainer ossContainer,
string prefix = null, string prefix = null,
string marker = null, string marker = null,
int maxResultCount = 10) int skipCount = 0,
{ int maxResultCount = 10)
return await ossContainer.GetListAsync( {
new GetOssContainersRequest(prefix, marker, maxResultCount)); return await ossContainer.GetListAsync(
} new GetOssContainersRequest(prefix, marker, skipCount, maxResultCount));
}
public static async Task<OssObject> GetObjectAsync(
this IOssContainer ossContainer, public static async Task<OssObject> GetObjectAsync(
string bucket, this IOssContainer ossContainer,
string @object, string bucket,
string path = "") string @object,
{ string path = "")
return await ossContainer.GetObjectAsync( {
new GetOssObjectRequest(bucket, @object, path)); return await ossContainer.GetObjectAsync(
} new GetOssObjectRequest(bucket, @object, path));
}
public static async Task<GetOssObjectsResponse> GetObjectsAsync(
this IOssContainer ossContainer, public static async Task<GetOssObjectsResponse> GetObjectsAsync(
string name, this IOssContainer ossContainer,
string prefix = null, string name,
string marker = null, string prefix = null,
string delimiter = null, string marker = null,
string encodingType = null, string delimiter = null,
int maxResultCount = 10) string encodingType = null,
{ int skipCount = 0,
return await ossContainer.GetObjectsAsync( int maxResultCount = 10)
new GetOssObjectsRequest(name, prefix, marker, delimiter, encodingType, maxResultCount)); {
} return await ossContainer.GetObjectsAsync(
} new GetOssObjectsRequest(name, prefix, marker, delimiter, encodingType, skipCount, maxResultCount));
} }
}
}

84
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); 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 // 本地文件系统直接用PageBy即可
.Take(maxResultCount) var directoryInfos = directories
.AsQueryable()
.PageBy(request.Current, request.MaxKeys ?? 10)
.Select(file => new DirectoryInfo(file)) .Select(file => new DirectoryInfo(file))
.ToArray(); .ToArray();
var nextMarkerIndex = directories.FindIndex(x => x.EndsWith(directoryInfos[directoryInfos.Length - 1].Name)); 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); return x.CompareTo(y);
}); });
// 需要计算从哪个位置截断 //// 需要计算从哪个位置截断
int markIndex = 0; //int markIndex = 0;
if (!request.Marker.IsNullOrWhiteSpace()) //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 (File.Exists(path))
if (markIndex < 0)
{ {
markIndex = 0; return new FileInfo(path);
} }
}
// 需要截断Oss对象列表 return new DirectoryInfo(path);
var copyFileSystemNames = fileSystemNames;
if (markIndex > 0)
{
// fix: 翻页查询数组可能引起下标越界
// copyFileSystemNames = fileSystemNames[(markIndex+1)..];
copyFileSystemNames = fileSystemNames[markIndex..];
} }
// 截取指定数量的Oss对象
int maxResultCount = request.MaxKeys ?? 10; var fileSystems = fileSystemNames
// Oss对象信息集合 .AsQueryable()
var fileSystems = copyFileSystemNames .PageBy(request.Current, request.MaxKeys ?? 10)
.Take(maxResultCount) .Select(ConvertFileSystem)
.Select<string, FileSystemInfo>(file =>
{
if (File.Exists(file))
{
return new FileInfo(file);
}
return new DirectoryInfo(file);
})
.ToArray(); .ToArray();
// 计算下一页起始标记文件/目录名称 // 计算下一页起始标记文件/目录名称

Loading…
Cancel
Save