From d8f808e8ddc62cf752e5b9a0a3770f916d49e537 Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Tue, 23 Nov 2021 23:15:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(oss):=20=E4=BD=BF=E7=94=A8=20IRemoteStream?= =?UTF-8?q?Content=20=E6=9B=BF=E4=BB=A3=20IFormFile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Abp/OssManagement/CreateOssObjectInput.cs | 54 +++++----- .../Abp/OssManagement/IFileAppService.cs | 6 +- .../OssManagement/IStaticFilesAppService.cs | 22 ++-- .../Abp/OssManagement/UploadFileChunkInput.cs | 4 +- .../Abp/OssManagement/UploadFileInput.cs | 4 +- .../Abp/OssManagement/FileAppServiceBase.cs | 27 ++++- .../Abp/OssManagement/FileUploadMerger.cs | 10 +- .../LINGYUN/Abp/OssManagement/FileUploader.cs | 58 +++++----- .../Abp/OssManagement/OssObjectAppService.cs | 6 +- .../OssManagement/PrivateFileAppService.cs | 4 +- .../Abp/OssManagement/PublicFileAppService.cs | 3 +- .../OssManagement/StaticFilesAppService.cs | 6 +- .../Abp/OssManagement/OssObjectController.cs | 15 +-- .../OssManagement/PrivateFilesController.cs | 100 +++++------------- .../OssManagement/PublicFilesController.cs | 78 +++----------- .../OssManagement/StaticFilesController.cs | 71 ++----------- .../Abp/OssManagement/UploadOssObjectInput.cs | 37 ------- 17 files changed, 167 insertions(+), 338 deletions(-) delete mode 100644 aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/UploadOssObjectInput.cs diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/CreateOssObjectInput.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/CreateOssObjectInput.cs index e8616aa64..3d9238972 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/CreateOssObjectInput.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/CreateOssObjectInput.cs @@ -1,26 +1,28 @@ -using System; -using System.IO; -using Volo.Abp.Auditing; -using Volo.Abp.Validation; - -namespace LINGYUN.Abp.OssManagement -{ - public class CreateOssObjectInput - { - public string Bucket { get; set; } - public string Path { get; set; } - public string Object { get; set; } - public bool Overwrite { get; set; } - - [DisableAuditing] - [DisableValidation] - public Stream Content { get; set; } - public TimeSpan? ExpirationTime { get; set; } - - public void SetContent(Stream content) - { - Content = content; - Content?.Seek(0, SeekOrigin.Begin); - } - } -} +using System; +using System.IO; +using Volo.Abp.Auditing; +using Volo.Abp.Content; +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.OssManagement +{ + public class CreateOssObjectInput + { + public string Bucket { get; set; } + public string Path { get; set; } + public string FileName { get; set; } + public bool Overwrite { get; set; } + + [DisableAuditing] + [DisableValidation] + public IRemoteStreamContent File { get; set; } + + public TimeSpan? ExpirationTime { get; set; } + + public void SetContent(Stream content) + { + content.Seek(0, SeekOrigin.Begin); + File = new RemoteStreamContent(content); + } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileAppService.cs index f2cecf008..dde139284 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileAppService.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileAppService.cs @@ -1,7 +1,7 @@ -using System.IO; -using System.Threading.Tasks; +using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; +using Volo.Abp.Content; namespace LINGYUN.Abp.OssManagement { @@ -9,7 +9,7 @@ namespace LINGYUN.Abp.OssManagement { Task UploadAsync(UploadFileInput input); - Task GetAsync(GetPublicFileInput input); + Task GetAsync(GetPublicFileInput input); Task> GetListAsync(GetFilesInput input); diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IStaticFilesAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IStaticFilesAppService.cs index 50426c914..6fe09c2a9 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IStaticFilesAppService.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IStaticFilesAppService.cs @@ -1,11 +1,11 @@ -using System.IO; -using System.Threading.Tasks; -using Volo.Abp.Application.Services; - -namespace LINGYUN.Abp.OssManagement -{ - public interface IStaticFilesAppService: IApplicationService - { - Task GetAsync(GetStaticFileInput input); - } -} +using System.Threading.Tasks; +using Volo.Abp.Application.Services; +using Volo.Abp.Content; + +namespace LINGYUN.Abp.OssManagement +{ + public interface IStaticFilesAppService: IApplicationService + { + Task GetAsync(GetStaticFileInput input); + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileChunkInput.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileChunkInput.cs index 48141a639..250cfef66 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileChunkInput.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileChunkInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -using System.IO; using Volo.Abp.Auditing; +using Volo.Abp.Content; using Volo.Abp.Validation; namespace LINGYUN.Abp.OssManagement @@ -36,6 +36,6 @@ namespace LINGYUN.Abp.OssManagement [DisableAuditing] [DisableValidation] - public Stream Content { get; set; } + public IRemoteStreamContent File { get; set; } } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileInput.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileInput.cs index 2f54ca7f4..10af3220f 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileInput.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileInput.cs @@ -1,6 +1,6 @@ using System.ComponentModel.DataAnnotations; -using System.IO; using Volo.Abp.Auditing; +using Volo.Abp.Content; using Volo.Abp.Validation; namespace LINGYUN.Abp.OssManagement @@ -14,6 +14,6 @@ namespace LINGYUN.Abp.OssManagement [Required] [DisableAuditing] [DisableValidation] - public Stream Content { get; set; } + public IRemoteStreamContent File { get; set; } } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs index bfffda13b..e54350a43 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs @@ -2,11 +2,14 @@ using LINGYUN.Abp.OssManagement.Features; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.IO; using System.Threading.Tasks; using System.Web; using Volo.Abp.Application.Dtos; +using Volo.Abp.Content; using Volo.Abp.Features; +using Volo.Abp.Validation; namespace LINGYUN.Abp.OssManagement { @@ -33,7 +36,7 @@ namespace LINGYUN.Abp.OssManagement new UploadFileChunkInput { Bucket = GetCurrentBucket(), - Content = input.Content, + File = input.File, FileName = input.FileName, TotalSize = input.TotalSize, ChunkSize = input.ChunkSize, @@ -51,9 +54,14 @@ namespace LINGYUN.Abp.OssManagement LimitPolicy.Month)] public virtual async Task UploadAsync(UploadFileInput input) { + if (!input.File.ContentLength.HasValue) + { + ThrowValidationException(L["FileNotBeNullOrEmpty"], "File"); + } + await FileValidater.ValidationAsync(new UploadFile { - TotalSize = input.Content.Length, + TotalSize = input.File.ContentLength.Value, FileName = input.Object }); @@ -62,7 +70,7 @@ namespace LINGYUN.Abp.OssManagement var createOssObjectRequest = new CreateOssObjectRequest( GetCurrentBucket(), HttpUtility.UrlDecode(input.Object), - input.Content, + input.File.GetStream(), GetCurrentPath(HttpUtility.UrlDecode(input.Path))) { Overwrite = input.Overwrite @@ -91,7 +99,7 @@ namespace LINGYUN.Abp.OssManagement AbpOssManagementFeatureNames.OssObject.DownloadLimit, AbpOssManagementFeatureNames.OssObject.DownloadInterval, LimitPolicy.Month)] - public virtual async Task GetAsync(GetPublicFileInput input) + public virtual async Task GetAsync(GetPublicFileInput input) { var ossObjectRequest = new GetOssObjectRequest( GetCurrentBucket(), @@ -106,7 +114,7 @@ namespace LINGYUN.Abp.OssManagement var ossContainer = OssContainerFactory.Create(); var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest); - return ossObject.Content; + return new RemoteStreamContent(ossObject.Content); } public virtual async Task DeleteAsync(GetPublicFileInput input) @@ -134,5 +142,14 @@ namespace LINGYUN.Abp.OssManagement path = path.RemovePreFix(".").RemovePreFix("/"); return path; } + + private static void ThrowValidationException(string message, string memberName) + { + throw new AbpValidationException(message, + new List + { + new ValidationResult(message, new[] {memberName}) + }); + } } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploadMerger.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploadMerger.cs index ee8299765..1240d4fcf 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploadMerger.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploadMerger.cs @@ -40,23 +40,23 @@ namespace LINGYUN.Abp.OssManagement LimitPolicy.Month)] public virtual async Task MergeAsync(CreateOssObjectInput input) { - if (input.Content.IsNullOrEmpty()) + if (!input.File.ContentLength.HasValue) { ThrowValidationException(_stringLocalizer["FileNotBeNullOrEmpty"], "File"); } await _fileValidater.ValidationAsync(new UploadFile { - TotalSize = input.Content.Length, - FileName = input.Object + TotalSize = input.File.ContentLength.Value, + FileName = input.FileName }); var oss = CreateOssContainer(); var createOssObjectRequest = new CreateOssObjectRequest( input.Bucket, - input.Object, - input.Content, + input.FileName, + input.File.GetStream(), input.Path, input.ExpirationTime) { diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploader.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploader.cs index 80a15d9bb..28ec1b75a 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploader.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploader.cs @@ -44,43 +44,47 @@ namespace LINGYUN.Abp.OssManagement // 以上传的分片索引创建临时文件 var tempSavedFile = Path.Combine(tempFilePath, $"{input.ChunkNumber}.upd"); - if (input.Content != null) + if (input.File != null) { // 保存临时文件 - using var fs = new FileStream(tempSavedFile, FileMode.Create, FileAccess.Write); - // 写入当前分片文件 - await input.Content.CopyToAsync(fs); + using (var fs = new FileStream(tempSavedFile, FileMode.Create, FileAccess.Write)) + { + // 写入当前分片文件 + await input.File.GetStream().CopyToAsync(fs); + } } if (input.ChunkNumber == input.TotalChunks) { var mergeTmpFile = Path.Combine(tempFilePath, input.FileName); // 创建临时合并文件流 - using var mergeFileStream = new FileStream(mergeTmpFile, FileMode.Create, FileAccess.ReadWrite); - var createOssObjectInput = new CreateOssObjectInput - { - Bucket = input.Bucket, - Path = input.Path, - Object = input.FileName - }; - // 合并文件 - var mergeSavedFile = Path.Combine(tempFilePath, $"{input.FileName}"); - // 获取并排序所有分片文件 - var mergeFiles = Directory.GetFiles(tempFilePath, "*.upd").OrderBy(f => f.Length).ThenBy(f => f); - // 创建临时合并文件 - foreach (var mergeFile in mergeFiles) + using (var mergeFileStream = new FileStream(mergeTmpFile, FileMode.Create, FileAccess.ReadWrite)) { - // 读取当前文件字节 - var mergeFileBytes = await FileHelper.ReadAllBytesAsync(mergeFile); - // 写入到合并文件流 - await mergeFileStream.WriteAsync(mergeFileBytes, 0, mergeFileBytes.Length, cancellationToken); - Array.Clear(mergeFileBytes, 0, mergeFileBytes.Length); - // 删除已参与合并的临时文件分片 - FileHelper.DeleteIfExists(mergeFile); + var createOssObjectInput = new CreateOssObjectInput + { + Bucket = input.Bucket, + Path = input.Path, + FileName = input.FileName + }; + // 合并文件 + var mergeSavedFile = Path.Combine(tempFilePath, $"{input.FileName}"); + // 获取并排序所有分片文件 + var mergeFiles = Directory.GetFiles(tempFilePath, "*.upd").OrderBy(f => f.Length).ThenBy(f => f); + // 创建临时合并文件 + foreach (var mergeFile in mergeFiles) + { + // 读取当前文件字节 + var mergeFileBytes = await FileHelper.ReadAllBytesAsync(mergeFile); + // 写入到合并文件流 + await mergeFileStream.WriteAsync(mergeFileBytes, 0, mergeFileBytes.Length, cancellationToken); + Array.Clear(mergeFileBytes, 0, mergeFileBytes.Length); + // 删除已参与合并的临时文件分片 + FileHelper.DeleteIfExists(mergeFile); + } + createOssObjectInput.SetContent(mergeFileStream); + // 分离出合并接口,合并时计算上传次数 + await _fileUploadMerger.MergeAsync(createOssObjectInput); } - createOssObjectInput.SetContent(mergeFileStream); - // 分离出合并接口,合并时计算上传次数 - await _fileUploadMerger.MergeAsync(createOssObjectInput); // 文件保存之后删除临时文件目录 DirectoryHelper.DeleteIfExists(tempFilePath, true); } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs index 7d1e93dc2..17c59d715 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/OssObjectAppService.cs @@ -24,13 +24,13 @@ namespace LINGYUN.Abp.OssManagement public virtual async Task CreateAsync(CreateOssObjectInput input) { // 内容为空时建立目录 - if (input.Content.IsNullOrEmpty()) + if (input.File.ContentLength.HasValue) { var oss = CreateOssContainer(); var request = new CreateOssObjectRequest( HttpUtility.UrlDecode(input.Bucket), - HttpUtility.UrlDecode(input.Object), - input.Content, + HttpUtility.UrlDecode(input.FileName), + Stream.Null, HttpUtility.UrlDecode(input.Path)); var ossObject = await oss.CreateObjectAsync(request); diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PrivateFileAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PrivateFileAppService.cs index 59c5bb7ed..0ddeb607b 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PrivateFileAppService.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PrivateFileAppService.cs @@ -2,11 +2,11 @@ using Microsoft.Extensions.Caching.Distributed; using System; using System.Collections.Generic; -using System.IO; using System.Threading.Tasks; using System.Web; using Volo.Abp.Application.Dtos; using Volo.Abp.Caching; +using Volo.Abp.Content; using Volo.Abp.IO; using Volo.Abp.Users; @@ -37,7 +37,7 @@ namespace LINGYUN.Abp.OssManagement } [Authorize] - public override async Task GetAsync(GetPublicFileInput input) + public override async Task GetAsync(GetPublicFileInput input) { return await base.GetAsync(input); } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PublicFileAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PublicFileAppService.cs index bb42b70a9..8105cc000 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PublicFileAppService.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PublicFileAppService.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Authorization; using System.IO; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; +using Volo.Abp.Content; using Volo.Abp.Features; namespace LINGYUN.Abp.OssManagement @@ -63,7 +64,7 @@ namespace LINGYUN.Abp.OssManagement AbpOssManagementFeatureNames.OssObject.DownloadLimit, AbpOssManagementFeatureNames.OssObject.DownloadInterval, LimitPolicy.Month)] - public override async Task GetAsync(GetPublicFileInput input) + public override async Task GetAsync(GetPublicFileInput input) { await CheckPublicAccessAsync(); await FeatureChecker.CheckEnabledAsync(AbpOssManagementFeatureNames.OssObject.DownloadFile); diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs index de06e409f..6944babd3 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/StaticFilesAppService.cs @@ -1,8 +1,8 @@ using LINGYUN.Abp.Features.LimitValidation; using LINGYUN.Abp.OssManagement.Features; -using System.IO; using System.Threading.Tasks; using System.Web; +using Volo.Abp.Content; using Volo.Abp.Features; namespace LINGYUN.Abp.OssManagement @@ -22,7 +22,7 @@ namespace LINGYUN.Abp.OssManagement AbpOssManagementFeatureNames.OssObject.DownloadLimit, AbpOssManagementFeatureNames.OssObject.DownloadInterval, LimitPolicy.Month)] - public virtual async Task GetAsync(GetStaticFileInput input) + public virtual async Task GetAsync(GetStaticFileInput input) { var ossObjectRequest = new GetOssObjectRequest( HttpUtility.UrlDecode(input.Bucket), // 需要处理特殊字符 @@ -36,7 +36,7 @@ namespace LINGYUN.Abp.OssManagement var ossContainer = OssContainerFactory.Create(); var ossObject = await ossContainer.GetObjectAsync(ossObjectRequest); - return ossObject.Content; + return new RemoteStreamContent(ossObject.Content, ossObject.Name); } } } 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 d9aea7344..72a51cb75 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 @@ -34,20 +34,9 @@ namespace LINGYUN.Abp.OssManagement [Route("upload")] [DisableAuditing] [Authorize(AbpOssManagementPermissions.OssObject.Create)] - public virtual async Task UploadAsync([FromForm] UploadOssObjectInput input) + public virtual async Task UploadAsync(UploadFileChunkInput input) { - await FileUploader.UploadAsync(new UploadFileChunkInput - { - Path = input.Path, - Bucket = input.Bucket, - FileName = input.FileName, - TotalSize = input.TotalSize, - ChunkSize = input.ChunkSize, - ChunkNumber = input.ChunkNumber, - TotalChunks = input.TotalChunks, - CurrentChunkSize = input.CurrentChunkSize, - Content = input.File?.OpenReadStream(), - }, HttpContext.RequestAborted); + await FileUploader.UploadAsync(input); } [HttpDelete] diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PrivateFilesController.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PrivateFilesController.cs index bf436e270..29db9b895 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PrivateFilesController.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PrivateFilesController.cs @@ -2,126 +2,78 @@ using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.IO; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.Http; +using Volo.Abp.Content; using Volo.Abp.Validation; namespace LINGYUN.Abp.OssManagement { + [RemoteService(Name = OssManagementRemoteServiceConsts.RemoteServiceName)] [Area("oss-management")] [Route("api/files/private")] - [RemoteService(false)] - public class PrivateFilesController : AbpController + public class PrivateFilesController : AbpController, IPrivateFileAppService { - private readonly IPrivateFileAppService _privateFileAppService; + private readonly IPrivateFileAppService _service; public PrivateFilesController( - IPrivateFileAppService privateFileAppService) + IPrivateFileAppService service) { - _privateFileAppService = privateFileAppService; + _service = service; LocalizationResource = typeof(AbpOssManagementResource); } [HttpPost] - [Route("upload")] - public virtual async Task UploadAsync([FromForm] UploadOssObjectInput input) + public virtual async Task UploadAsync([FromForm] UploadFileInput input) { - await _privateFileAppService.UploadAsync(new UploadFileChunkInput - { - Path = input.Path, - FileName = input.FileName, - TotalSize = input.TotalSize, - ChunkSize = input.ChunkSize, - ChunkNumber = input.ChunkNumber, - TotalChunks = input.TotalChunks, - CurrentChunkSize = input.CurrentChunkSize, - Content = input.File?.OpenReadStream(), - }); + return await _service.UploadAsync(input); } [HttpPost] - [Route("{path}")] - [Route("{path}/{name}")] - public virtual async Task UploadAsync(string path, string name) + [Route("upload")] + public virtual async Task UploadAsync(UploadFileChunkInput input) { - if (Request.ContentLength <= 0) - { - ThrowValidationException(L["FileNotBeNullOrEmpty"], "File"); - } - - var file = Request.Form.Files[0]; - var fileName = name ?? file.FileName; - - var createOssObjectInput = new UploadFileInput - { - Path = path, - Object = fileName, - Content = file.OpenReadStream(), - Overwrite = true - }; - - return await _privateFileAppService.UploadAsync(createOssObjectInput); + await _service.UploadAsync(input); } [HttpGet] [Route("search")] public virtual async Task> GetListAsync(GetFilesInput input) { - return await _privateFileAppService.GetListAsync(input); + return await _service.GetListAsync(input); } [HttpGet] - [Route("{name}")] - [Route("{name}/{process}")] - [Route("p/{path}/{name}")] - [Route("p/{path}/{name}/{process}")] - public virtual async Task GetAsync(string path, string name, string process) + [Route("{Name}")] + [Route("{Name}/{Process}")] + [Route("p/{Path}/{Name}")] + [Route("p/{Path}/{Name}/{Process}")] + public virtual async Task GetAsync([FromRoute] GetPublicFileInput input) { - var input = new GetPublicFileInput - { - Name = name, - Path = path, - Process = process - }; - var fileStream = await _privateFileAppService.GetAsync(input); - - if (fileStream.IsNullOrEmpty()) - { - return NotFound(); - } + return await _service.GetAsync(input); + } - return File( - fileStream, - MimeTypes.GetByExtension(Path.GetExtension(input.Name)) - ); + [HttpDelete] + public virtual async Task DeleteAsync(GetPublicFileInput input) + { + await _service.DeleteAsync(input); } [HttpGet] [Route("share")] public virtual async Task> GetShareListAsync() { - return await _privateFileAppService.GetShareListAsync(); + return await _service.GetShareListAsync(); } [HttpPost] [Route("share")] - public virtual async Task ShareAsync([FromBody] FileShareInput input) - { - return await _privateFileAppService.ShareAsync(input); - } - - private static void ThrowValidationException(string message, string memberName) + public virtual async Task ShareAsync(FileShareInput input) { - throw new AbpValidationException(message, - new List - { - new ValidationResult(message, new[] {memberName}) - }); + return await _service.ShareAsync(input); } } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PublicFilesController.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PublicFilesController.cs index 9c9f500e0..74aaf07e8 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PublicFilesController.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PublicFilesController.cs @@ -1,21 +1,17 @@ using LINGYUN.Abp.OssManagement.Localization; using Microsoft.AspNetCore.Mvc; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.IO; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.Http; -using Volo.Abp.Validation; +using Volo.Abp.Content; namespace LINGYUN.Abp.OssManagement { + [RemoteService(Name = OssManagementRemoteServiceConsts.RemoteServiceName)] [Area("oss-management")] [Route("api/files/public")] - [RemoteService(false)] - public class PublicFilesController : AbpController + public class PublicFilesController : AbpController, IPublicFileAppService { private readonly IPublicFileAppService _publicFileAppService; @@ -29,44 +25,16 @@ namespace LINGYUN.Abp.OssManagement [HttpPost] - [Route("upload")] - public virtual async Task UploadAsync([FromForm] UploadOssObjectInput input) + public virtual async Task UploadAsync([FromForm] UploadFileInput input) { - await _publicFileAppService.UploadAsync(new UploadFileChunkInput - { - Path = input.Path, - FileName = input.FileName, - TotalSize = input.TotalSize, - ChunkSize = input.ChunkSize, - ChunkNumber = input.ChunkNumber, - TotalChunks = input.TotalChunks, - CurrentChunkSize = input.CurrentChunkSize, - Content = input.File?.OpenReadStream(), - }); + return await _publicFileAppService.UploadAsync(input); } [HttpPost] - [Route("{path}")] - [Route("{path}/{name}")] - public virtual async Task UploadAsync(string path, string name) + [Route("upload")] + public virtual async Task UploadAsync(UploadFileChunkInput input) { - if (Request.ContentLength <= 0) - { - ThrowValidationException(L["FileNotBeNullOrEmpty"], "File"); - } - - var file = Request.Form.Files[0]; - var fileName = name ?? file.FileName; - - var createOssObjectInput = new UploadFileInput - { - Path = path, - Object = fileName, - Content = file.OpenReadStream(), - Overwrite = true - }; - - return await _publicFileAppService.UploadAsync(createOssObjectInput); + await _publicFileAppService.UploadAsync(input); } [HttpGet] @@ -76,39 +44,21 @@ namespace LINGYUN.Abp.OssManagement return await _publicFileAppService.GetListAsync(input); } + [HttpGet] [Route("{name}")] [Route("{name}/{process}")] [Route("p/{path}/{name}")] [Route("p/{path}/{name}/{process}")] - public virtual async Task GetAsync(string path, string name, string process) + public virtual async Task GetAsync(GetPublicFileInput input) { - var input = new GetPublicFileInput - { - Name = name, - Path = path, - Process = process - }; - var fileStream = await _publicFileAppService.GetAsync(input); - - if (fileStream.IsNullOrEmpty()) - { - return NotFound(); - } - - return File( - fileStream, - MimeTypes.GetByExtension(Path.GetExtension(input.Name)) - ); + return await _publicFileAppService.GetAsync(input); } - private static void ThrowValidationException(string message, string memberName) + [HttpDelete] + public virtual async Task DeleteAsync(GetPublicFileInput input) { - throw new AbpValidationException(message, - new List - { - new ValidationResult(message, new[] {memberName}) - }); + await _publicFileAppService.DeleteAsync(input); } } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/StaticFilesController.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/StaticFilesController.cs index d07942c02..a5c736504 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/StaticFilesController.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/StaticFilesController.cs @@ -2,23 +2,17 @@ using LINGYUN.Abp.OssManagement.Permissions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.IO; using System.Threading.Tasks; -using System.Web; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.Http; -using Volo.Abp.Validation; +using Volo.Abp.Content; namespace LINGYUN.Abp.OssManagement { + [RemoteService(Name = OssManagementRemoteServiceConsts.RemoteServiceName)] [Area("oss-management")] [Route("api/files/static")] - [RemoteService(false)] - [ApiExplorerSettings(IgnoreApi = true)] - public class StaticFilesController : AbpController + public class StaticFilesController : AbpController, IStaticFilesAppService { private readonly IOssObjectAppService _ossObjectAppService; private readonly IStaticFilesAppService _staticFilesAppServic; @@ -34,63 +28,20 @@ namespace LINGYUN.Abp.OssManagement } [HttpPost] - [Route("{bucket}")] - [Route("{bucket}/p/{path}")] - [Route("{bucket}/p/{path}/{name}")] [Authorize(AbpOssManagementPermissions.OssObject.Create)] - public virtual async Task UploadAsync(string bucket, string path, string name) + public virtual async Task UploadAsync([FromForm] CreateOssObjectInput input) { - if (Request.ContentLength <= 0) - { - ThrowValidationException(L["FileNotBeNullOrEmpty"], "File"); - } - - var createOssObjectInput = new CreateOssObjectInput - { - Bucket = HttpUtility.UrlDecode(bucket), - Path = HttpUtility.UrlDecode(path), - Object = name ?? Request.Form.Files[0].FileName, - Content = Request.Form.Files[0].OpenReadStream(), - Overwrite = true - }; - - return await _ossObjectAppService.CreateAsync(createOssObjectInput); + return await _ossObjectAppService.CreateAsync(input); } [HttpGet] - [Route("{bucket}/{name}")] - [Route("{bucket}/{name}/{process}")] - [Route("{bucket}/p/{path}/{name}")] - [Route("{bucket}/p/{path}/{name}/{process}")] - public virtual async Task GetAsync(string bucket, string path, string name, string process) - { - var input = new GetStaticFileInput - { - Bucket = bucket, - Name = name, - Path = path, - Process = process - }; - var fileStream = await _staticFilesAppServic.GetAsync(input); - - if (fileStream.IsNullOrEmpty()) - { - return NotFound(); - } - - return File( - fileStream, - MimeTypes.GetByExtension(Path.GetExtension(input.Name)) - ); - } - - private static void ThrowValidationException(string message, string memberName) + [Route("{Bucket}/{Name}")] + [Route("{Bucket}/{Name}/{Process}")] + [Route("{Bucket}/p/{Path}/{Name}")] + [Route("{Bucket}/p/{Path}/{Name}/{Process}")] + public virtual async Task GetAsync([FromRoute] GetStaticFileInput input) { - throw new AbpValidationException(message, - new List - { - new ValidationResult(message, new[] {memberName}) - }); + return await _staticFilesAppServic.GetAsync(input); } } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/UploadOssObjectInput.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/UploadOssObjectInput.cs deleted file mode 100644 index a75819221..000000000 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/UploadOssObjectInput.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Microsoft.AspNetCore.Http; -using System.ComponentModel.DataAnnotations; - -namespace LINGYUN.Abp.OssManagement -{ - public class UploadOssObjectInput : UploadFile - { - public string Bucket { get; set; } - public string Path { get; set; } - - #region 配合Uplaoder 分块传输 - /// - /// 常规块大小 - /// - [Required] - public long ChunkSize { get; set; } - /// - /// 当前块大小 - /// - [Required] - public long CurrentChunkSize { get; set; } - /// - /// 当前上传中块的索引 - /// - [Required] - public int ChunkNumber { get; set; } - /// - /// 块总数 - /// - [Required] - public int TotalChunks { get; set; } - - #endregion - - public IFormFile File { get; set; } - } -}