diff --git a/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN.Abp.Cli.csproj b/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN.Abp.Cli.csproj index fbba86d1c..232bf7fbb 100644 --- a/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN.Abp.Cli.csproj +++ b/aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN.Abp.Cli.csproj @@ -5,11 +5,15 @@ Exe net6.0 - 5.0.0 - true - labp - ./nupkg - + 5.0.1 + colin + Use LINGYUN.MicroService.Templates command line + true + labp + ./nupkg + MIT + https://github.com/colinin/abp-next-admin + diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobNamingNormalizer.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobNamingNormalizer.cs index 5a6ffbba9..7f10f5c99 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobNamingNormalizer.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobNamingNormalizer.cs @@ -1,6 +1,4 @@ using System; -using System.Text; -using System.Web; using Volo.Abp.BlobStoring; using Volo.Abp.DependencyInjection; @@ -8,16 +6,28 @@ namespace LINGYUN.Abp.BlobStoring.OssManagement { public class OssManagementBlobNamingNormalizer : IBlobNamingNormalizer, ITransientDependency { - public string NormalizeBlobName(string blobName) + public virtual string NormalizeBlobName(string blobName) { - // 路径需要URL编码 - return HttpUtility.UrlEncode(blobName, Encoding.UTF8); + return NormalizeName(blobName); } - public string NormalizeContainerName(string containerName) + public virtual string NormalizeContainerName(string containerName) { + // 尾部添加反斜杠 + return NormalizeName(containerName).EnsureEndsWith('/'); + } + + protected virtual string NormalizeName(string name) + { + // 取消路径修饰符 + name = name.Replace("./", "").Replace("../", ""); // 取消反斜杠开头 - return containerName.EnsureStartsWith('/'); + if (name.StartsWith("/")) + { + name = name.Substring(1); + } + + return name; } } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobProvider.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobProvider.cs index 100fe5c5c..4b1961a16 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobProvider.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.BlobStoring.OssManagement/LINGYUN/Abp/BlobStoring/OssManagement/OssManagementBlobProvider.cs @@ -29,7 +29,8 @@ namespace LINGYUN.Abp.BlobStoring.OssManagement await _ossObjectAppService.DeleteAsync(new GetOssObjectInput { Bucket = configuration.Bucket, - Object = args.BlobName + Path = GetOssPath(args), + Object = GetOssName(args), }); return true; } @@ -42,7 +43,8 @@ namespace LINGYUN.Abp.BlobStoring.OssManagement var oss = await _ossObjectAppService.GetAsync(new GetOssObjectInput { Bucket = configuration.Bucket, - Object = args.BlobName + Path = GetOssPath(args), + Object = GetOssName(args), }); return oss != null; } @@ -63,12 +65,13 @@ namespace LINGYUN.Abp.BlobStoring.OssManagement var content = await _ossObjectAppService.GetContentAsync(new GetOssObjectInput { Bucket = configuration.Bucket, - Object = args.BlobName + Path = GetOssPath(args), + Object = GetOssName(args), }); return content?.GetStream(); } - catch(Exception ex) + catch (Exception ex) { Logger.LogWarning("An error occurred while getting the OSS object and an empty data stream will be returned"); Logger.LogWarning(ex.Message); @@ -83,10 +86,39 @@ namespace LINGYUN.Abp.BlobStoring.OssManagement await _ossObjectAppService.CreateAsync(new CreateOssObjectInput { Bucket = configuration.Bucket, - Overwrite = true, - FileName = args.BlobName, + Overwrite = args.OverrideExisting, + Path = GetOssPath(args), + FileName = GetOssName(args), File = new RemoteStreamContent(args.BlobStream) }); } + + protected virtual string GetOssPath(BlobProviderArgs args) + { + // ContainerName: blob + // path1/path2/path3/path3/path5/file.txt => blob/path1/path2/path3/path3/path5/ + var path = args.ContainerName; + if (args.BlobName.Contains("/")) + { + var lastIndex = args.BlobName.LastIndexOf('/'); + path += args.BlobName.Substring(0, lastIndex); + } + + return path.EnsureEndsWith('/'); + } + + protected virtual string GetOssName(BlobProviderArgs args) + { + // path1/path2/path3/path3/path5/file.txt => file.txt + if (args.BlobName.Contains("/")) + { + var lastIndex = args.BlobName.LastIndexOf('/'); + + // TODO: 用户传递以 / 为结尾符的文件名,让系统抛出异常? + return args.BlobName.Substring(lastIndex + 1); + } + + return args.BlobName; + } } } 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 08942d48b..d2df531c8 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 @@ -26,7 +26,7 @@ namespace LINGYUN.Abp.OssManagement } [HttpPost] - public virtual async Task CreateAsync(CreateOssObjectInput input) + public virtual async Task CreateAsync([FromForm] CreateOssObjectInput input) { return await OssObjectAppService.CreateAsync(input); }