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();
// 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,

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 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<OssContainerDto> CreateAsync(string name)
{
var oss = CreateOssContainer();
var container = await oss.CreateAsync(name);
return ObjectMapper.Map<OssContainer, OssContainerDto>(container);
}
[Authorize(AbpOssManagementPermissions.Container.Delete)]
public virtual async Task DeleteAsync(string name)
{
var oss = CreateOssContainer();
await oss.DeleteAsync(name);
}
public virtual async Task<OssContainerDto> GetAsync(string name)
{
var oss = CreateOssContainer();
var container = await oss.GetAsync(name);
return ObjectMapper.Map<OssContainer, OssContainerDto>(container);
}
public virtual async Task<OssContainersResultDto> GetListAsync(GetOssContainersInput input)
{
var oss = CreateOssContainer();
var containerResponse = await oss.GetListAsync(
input.Prefix, input.Marker, input.MaxResultCount);
return ObjectMapper.Map<GetOssContainersResponse, OssContainersResultDto>(containerResponse);
}
public virtual async Task<OssObjectsResultDto> 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<GetOssObjectsResponse, OssObjectsResultDto>(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<OssContainerDto> CreateAsync(string name)
{
var oss = CreateOssContainer();
var container = await oss.CreateAsync(name);
return ObjectMapper.Map<OssContainer, OssContainerDto>(container);
}
[Authorize(AbpOssManagementPermissions.Container.Delete)]
public virtual async Task DeleteAsync(string name)
{
var oss = CreateOssContainer();
await oss.DeleteAsync(name);
}
public virtual async Task<OssContainerDto> GetAsync(string name)
{
var oss = CreateOssContainer();
var container = await oss.GetAsync(name);
return ObjectMapper.Map<OssContainer, OssContainerDto>(container);
}
public virtual async Task<OssContainersResultDto> GetListAsync(GetOssContainersInput input)
{
var oss = CreateOssContainer();
var containerResponse = await oss.GetListAsync(
input.Prefix, input.Marker, input.SkipCount, input.MaxResultCount);
return ObjectMapper.Map<GetOssContainersResponse, OssContainersResultDto>(containerResponse);
}
public virtual async Task<OssObjectsResultDto> 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<GetOssObjectsResponse, OssObjectsResultDto>(ossObjectResponse);
}
protected virtual IOssContainer CreateOssContainer()
{
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
{
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;
}
}
}

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

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.Threading.Tasks;
namespace LINGYUN.Abp.OssManagement
{
public static class IOssContainerExtensions
{
/// <summary>
/// 如果不存在容器则创建
/// </summary>
/// <param name="ossContainer"></param>
/// <param name="name"></param>
/// <returns>返回容器信息</returns>
public static async Task<OssContainer> 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<string> objectNames,
string path = "")
{
await ossContainer.BulkDeleteObjectsAsync(
new BulkDeleteObjectRequest(bucketName, objectNames, path));
}
public static async Task<GetOssContainersResponse> 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<OssObject> GetObjectAsync(
this IOssContainer ossContainer,
string bucket,
string @object,
string path = "")
{
return await ossContainer.GetObjectAsync(
new GetOssObjectRequest(bucket, @object, path));
}
public static async Task<GetOssObjectsResponse> 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
{
/// <summary>
/// 如果不存在容器则创建
/// </summary>
/// <param name="ossContainer"></param>
/// <param name="name"></param>
/// <returns>返回容器信息</returns>
public static async Task<OssContainer> 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<string> objectNames,
string path = "")
{
await ossContainer.BulkDeleteObjectsAsync(
new BulkDeleteObjectRequest(bucketName, objectNames, path));
}
public static async Task<GetOssContainersResponse> 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<OssObject> GetObjectAsync(
this IOssContainer ossContainer,
string bucket,
string @object,
string path = "")
{
return await ossContainer.GetObjectAsync(
new GetOssObjectRequest(bucket, @object, path));
}
public static async Task<GetOssObjectsResponse> 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));
}
}
}

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);
});
// 需要计算从哪个位置截断
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<string, FileSystemInfo>(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();
// 计算下一页起始标记文件/目录名称

Loading…
Cancel
Save