From 423c881fd628303f3d9dc897e20646e31a38350a Mon Sep 17 00:00:00 2001 From: colin Date: Mon, 28 Apr 2025 20:11:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(oss):=20=E5=A2=9E=E5=8A=A0oss=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E6=98=AF=E5=90=A6=E5=AD=98=E5=9C=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Aliyun/AliyunOssContainer.cs | 13 ++++++ .../Abp/OssManagement/IOssContainer.cs | 6 +++ .../Abp/OssManagement/OssContainerBase.cs | 2 + .../FileSystem/FileSystemOssContainer.cs | 16 +++++++ .../Abp/OssManagement/OssObjectController.cs | 46 ++++++++++++++----- .../OssManagement/Minio/MinioOssContainer.cs | 14 ++++++ .../OssManagement/Nexus/NexusOssContainer.cs | 16 +++++++ .../Tencent/TencentOssContainer.cs | 13 ++++++ 8 files changed, 114 insertions(+), 12 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 59293f610..b5805cae9 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 @@ -62,6 +62,19 @@ internal class AliyunOssContainer : OssContainerBase, IOssObjectExpireor }); } + public async override Task ObjectExistsAsync(GetOssObjectRequest request) + { + var ossClient = await CreateClientAsync(); + + var objectPath = GetBasePath(request.Path); + + var objectName = objectPath.IsNullOrWhiteSpace() + ? request.Object + : objectPath + request.Object; + + return ObjectExists(ossClient, request.Bucket, objectName); + } + public async override Task CreateObjectAsync(CreateOssObjectRequest request) { var ossClient = await CreateClientAsync(); diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainer.cs index 5f5169a1b..a88cc5524 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/IOssContainer.cs @@ -60,6 +60,12 @@ public interface IOssContainer /// Task ExistsAsync(string name); /// + /// Oss对象是否存在 + /// + /// + /// + Task ObjectExistsAsync(GetOssObjectRequest request); + /// /// 获取容器列表 /// /// diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssContainerBase.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssContainerBase.cs index ecd8670b3..27903ff33 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssContainerBase.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Domain/LINGYUN/Abp/OssManagement/OssContainerBase.cs @@ -65,4 +65,6 @@ public abstract class OssContainerBase : IOssContainer { return true; } + + public abstract Task ObjectExistsAsync(GetOssObjectRequest request); } 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 c27003be8..6f9d3e28f 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 @@ -122,6 +122,22 @@ internal class FileSystemOssContainer : OssContainerBase, IOssObjectExpireor return Task.CompletedTask; } + public override Task ObjectExistsAsync(GetOssObjectRequest request) + { + var objectPath = !request.Path.IsNullOrWhiteSpace() + ? request.Path.EnsureEndsWith('/') + : ""; + var objectName = objectPath.IsNullOrWhiteSpace() + ? request.Object + : objectPath + request.Object; + + var filePath = CalculateFilePath(request.Bucket, objectName); + + var objectExists = File.Exists(filePath) || Directory.Exists(filePath); + + return Task.FromResult(objectExists); + } + public async override Task CreateObjectAsync(CreateOssObjectRequest request) { var objectPath = !request.Path.IsNullOrWhiteSpace() diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/OssObjectController.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/OssObjectController.cs index 5e5d98a69..346be5846 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/OssObjectController.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/OssObjectController.cs @@ -1,6 +1,7 @@ using LINGYUN.Abp.OssManagement.Permissions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using System; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc; @@ -26,43 +27,64 @@ public class OssObjectController : AbpControllerBase, IOssObjectAppService } [HttpPost] - public async virtual Task CreateAsync([FromForm] CreateOssObjectInput input) + [Authorize(AbpOssManagementPermissions.OssObject.Create)] + public virtual Task CreateAsync([FromForm] CreateOssObjectInput input) { - return await OssObjectAppService.CreateAsync(input); + return OssObjectAppService.CreateAsync(input); } [HttpPost] [Route("upload")] [DisableAuditing] [Authorize(AbpOssManagementPermissions.OssObject.Create)] - public async virtual Task UploadAsync([FromForm] UploadFileChunkInput input) + public virtual Task UploadAsync([FromForm] UploadFileChunkInput input) { - await FileUploader.UploadAsync(input); + return FileUploader.UploadAsync(input); } [HttpPost] [Route("bulk-delete")] - public async virtual Task BulkDeleteAsync(BulkDeleteOssObjectInput input) + [Authorize(AbpOssManagementPermissions.OssObject.Delete)] + public virtual Task BulkDeleteAsync(BulkDeleteOssObjectInput input) { - await OssObjectAppService.BulkDeleteAsync(input); + return OssObjectAppService.BulkDeleteAsync(input); } [HttpDelete] - public async virtual Task DeleteAsync(GetOssObjectInput input) + [Authorize(AbpOssManagementPermissions.OssObject.Delete)] + public virtual Task DeleteAsync(GetOssObjectInput input) { - await OssObjectAppService.DeleteAsync(input); + return OssObjectAppService.DeleteAsync(input); } [HttpGet] - public async virtual Task GetAsync(GetOssObjectInput input) + [Authorize(AbpOssManagementPermissions.OssObject.Default)] + public virtual Task GetAsync(GetOssObjectInput input) { - return await OssObjectAppService.GetAsync(input); + return OssObjectAppService.GetAsync(input); } [HttpGet] [Route("download")] - public async virtual Task GetContentAsync(GetOssObjectInput input) + [Authorize(AbpOssManagementPermissions.OssObject.Download)] + [Obsolete("请使用 GenerateUrlAsync 与 DownloadAsync的组合")] + public virtual Task GetContentAsync(GetOssObjectInput input) + { + return OssObjectAppService.GetContentAsync(input); + } + + [HttpGet] + [Route("generate-url")] + [Authorize(AbpOssManagementPermissions.OssObject.Download)] + public virtual Task GenerateUrlAsync(GetOssObjectInput input) + { + return OssObjectAppService.GenerateUrlAsync(input); + } + + [HttpGet] + [Route("download/{urlKey}")] + public virtual Task DownloadAsync(string urlKey) { - return await OssObjectAppService.GetContentAsync(input); + return OssObjectAppService.DownloadAsync(urlKey); } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs index 5b81355c7..f2378750f 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Minio/LINGYUN/Abp/OssManagement/Minio/MinioOssContainer.cs @@ -95,6 +95,20 @@ public class MinioOssContainer : OssContainerBase, IOssObjectExpireor new Dictionary()); } + public async override Task ObjectExistsAsync(GetOssObjectRequest request) + { + var client = GetMinioClient(); + + var bucket = GetBucket(request.Bucket); + var prefixPath = GetPrefixPath(); + var objectPath = GetBlobPath(prefixPath, request.Path); + var objectName = objectPath.IsNullOrWhiteSpace() + ? request.Object + : objectPath + request.Object; + + return await ObjectExists(client, bucket, objectName); + } + public async override Task CreateObjectAsync(CreateOssObjectRequest request) { var client = GetMinioClient(); diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Nexus/LINGYUN/Abp/OssManagement/Nexus/NexusOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Nexus/LINGYUN/Abp/OssManagement/Nexus/NexusOssContainer.cs index 85e06ec8f..197059da4 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Nexus/LINGYUN/Abp/OssManagement/Nexus/NexusOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Nexus/LINGYUN/Abp/OssManagement/Nexus/NexusOssContainer.cs @@ -77,6 +77,22 @@ internal class NexusOssContainer : OssContainerBase, IOssObjectExpireor DateTime.Now); } + public async override Task ObjectExistsAsync(GetOssObjectRequest request) + { + var nexusConfiguration = GetNexusConfiguration(); + var blobPath = GetBasePath(request.Bucket, request.Path, request.Object); + + var searchBlobName = GetObjectName(request.Bucket, request.Path, request.Object); + var nexusSearchArgs = new NexusSearchArgs( + nexusConfiguration.Repository, + blobPath, + searchBlobName); + + var nexusAssetListResult = await NexusLookupService.ListAssetAsync(nexusSearchArgs); + + return nexusAssetListResult.Items.Count != 0; + } + public async override Task CreateObjectAsync(CreateOssObjectRequest request) { var nexusConfiguration = GetNexusConfiguration(); diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainer.cs index d39ddfcca..87153273f 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Tencent/LINGYUN/Abp/OssManagement/Tencent/TencentOssContainer.cs @@ -71,6 +71,19 @@ internal class TencentOssContainer : OssContainerBase, IOssObjectExpireor }); } + public async override Task ObjectExistsAsync(GetOssObjectRequest request) + { + var ossClient = await CreateClientAsync(); + + var objectPath = GetBasePath(request.Path); + + var objectName = objectPath.IsNullOrWhiteSpace() + ? request.Object + : objectPath + request.Object; + + return ObjectExists(ossClient, request.Bucket, objectName); + } + public async override Task CreateObjectAsync(CreateOssObjectRequest request) { var ossClient = await CreateClientAsync();