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 fe44d9d9c..5bf9a133f 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 @@ -6,8 +6,10 @@ namespace LINGYUN.Abp.OssManagement { public interface IFileAppService : IApplicationService { - Task UploadAsync(UploadPublicFileInput input); + Task UploadAsync(UploadFileInput input); Task GetAsync(GetPublicFileInput input); + + Task UploadAsync(UploadFileChunkInput input); } } diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileUploader.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileUploader.cs new file mode 100644 index 000000000..d97752324 --- /dev/null +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileUploader.cs @@ -0,0 +1,10 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.OssManagement +{ + public interface IFileUploader + { + Task UploadAsync(UploadFileChunkInput input, CancellationToken cancellationToken = default); + } +} 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 new file mode 100644 index 000000000..48141a639 --- /dev/null +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileChunkInput.cs @@ -0,0 +1,41 @@ +using System.ComponentModel.DataAnnotations; +using System.IO; +using Volo.Abp.Auditing; +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.OssManagement +{ + public class UploadFileChunkInput : 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 + + [DisableAuditing] + [DisableValidation] + public Stream Content { get; set; } + } +} diff --git a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadPublicFileInput.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileInput.cs similarity index 87% rename from aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadPublicFileInput.cs rename to aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileInput.cs index 6eb52a8bb..2f54ca7f4 100644 --- a/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadPublicFileInput.cs +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/UploadFileInput.cs @@ -5,7 +5,7 @@ using Volo.Abp.Validation; namespace LINGYUN.Abp.OssManagement { - public class UploadPublicFileInput + public class UploadFileInput { public string Path { get; set; } public string Object { 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 6ca0f744f..d8d2cce2b 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 @@ -10,23 +10,43 @@ namespace LINGYUN.Abp.OssManagement { public abstract class FileAppServiceBase : OssManagementApplicationServiceBase, IFileAppService { + private readonly IFileUploader _fileUploader; private readonly IFileValidater _fileValidater; private readonly IOssContainerFactory _ossContainerFactory; protected FileAppServiceBase( + IFileUploader fileUploader, IFileValidater fileValidater, IOssContainerFactory ossContainerFactory) { + _fileUploader = fileUploader; _fileValidater = fileValidater; _ossContainerFactory = ossContainerFactory; } + public virtual async Task UploadAsync(UploadFileChunkInput input) + { + await _fileUploader.UploadAsync( + new UploadFileChunkInput + { + Bucket = GetCurrentBucket(), + Content = input.Content, + FileName = input.FileName, + TotalSize = input.TotalSize, + ChunkSize = input.ChunkSize, + ChunkNumber = input.ChunkNumber, + TotalChunks = input.TotalChunks, + CurrentChunkSize = input.CurrentChunkSize, + Path = GetCurrentPath(HttpUtility.UrlDecode(input.Path)) + }); + } + [RequiresFeature(AbpOssManagementFeatureNames.OssObject.UploadFile)] [RequiresLimitFeature( AbpOssManagementFeatureNames.OssObject.UploadLimit, AbpOssManagementFeatureNames.OssObject.UploadInterval, LimitPolicy.Month)] - public virtual async Task UploadAsync(UploadPublicFileInput input) + public virtual async Task UploadAsync(UploadFileInput input) { await _fileValidater.ValidationAsync(new UploadFile { 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 new file mode 100644 index 000000000..ee8299765 --- /dev/null +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploadMerger.cs @@ -0,0 +1,82 @@ +using LINGYUN.Abp.Features.LimitValidation; +using LINGYUN.Abp.OssManagement.Features; +using LINGYUN.Abp.OssManagement.Localization; +using Microsoft.Extensions.Localization; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.IO; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; +using Volo.Abp.Validation; + +namespace LINGYUN.Abp.OssManagement +{ + public class FileUploadMerger : ITransientDependency + { + private readonly IFileValidater _fileValidater; + private readonly IOssContainerFactory _ossContainerFactory; + private readonly IStringLocalizer _stringLocalizer; + + public FileUploadMerger( + IFileValidater fileValidater, + IOssContainerFactory ossContainerFactory, + IStringLocalizer stringLocalizer) + { + _fileValidater = fileValidater; + _ossContainerFactory = ossContainerFactory; + _stringLocalizer = stringLocalizer; + } + + /// + /// 合并文件 + /// + /// + /// + [RequiresFeature(AbpOssManagementFeatureNames.OssObject.UploadFile)] + [RequiresLimitFeature( + AbpOssManagementFeatureNames.OssObject.UploadLimit, + AbpOssManagementFeatureNames.OssObject.UploadInterval, + LimitPolicy.Month)] + public virtual async Task MergeAsync(CreateOssObjectInput input) + { + if (input.Content.IsNullOrEmpty()) + { + ThrowValidationException(_stringLocalizer["FileNotBeNullOrEmpty"], "File"); + } + + await _fileValidater.ValidationAsync(new UploadFile + { + TotalSize = input.Content.Length, + FileName = input.Object + }); + + var oss = CreateOssContainer(); + + var createOssObjectRequest = new CreateOssObjectRequest( + input.Bucket, + input.Object, + input.Content, + input.Path, + input.ExpirationTime) + { + Overwrite = input.Overwrite + }; + return await oss.CreateObjectAsync(createOssObjectRequest); + } + + protected virtual IOssContainer CreateOssContainer() + { + return _ossContainerFactory.Create(); + } + + 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/FileUploader.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploader.cs new file mode 100644 index 000000000..a3cc4cc53 --- /dev/null +++ b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileUploader.cs @@ -0,0 +1,100 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.IO; + +namespace LINGYUN.Abp.OssManagement +{ + public class FileUploader : IFileUploader, ITransientDependency + { + private readonly IFileValidater _fileValidater; + private readonly FileUploadMerger _fileUploadMerger; + + public FileUploader( + IFileValidater fileValidater, + FileUploadMerger fileUploadMerger) + { + _fileValidater = fileValidater; + _fileUploadMerger = fileUploadMerger; + } + + public virtual async Task UploadAsync(UploadFileChunkInput input, CancellationToken cancellationToken = default) + { + await _fileValidater.ValidationAsync(input); + // 以上传的文件名创建一个临时目录 + var tempFilePath = Path.Combine( + Path.GetTempPath(), + "lingyun-abp-application", + "oss-upload-tmp", + string.Concat(input.Path ?? "", input.FileName).ToMd5()); + + try + { + // 重新开始 + if (input.ChunkNumber == 1) + { + DirectoryHelper.DeleteIfExists(tempFilePath); + } + + DirectoryHelper.CreateIfNotExists(tempFilePath); + + if (cancellationToken.IsCancellationRequested) + { + // 如果取消请求,删除临时目录 + Directory.Delete(tempFilePath, true); + return; + } + + // 以上传的分片索引创建临时文件 + var tempSavedFile = Path.Combine(tempFilePath, $"{input.ChunkNumber}.upd"); + if (input.Content != null) + { + // 保存临时文件 + using var fs = new FileStream(tempSavedFile, FileMode.Create, FileAccess.Write); + // 写入当前分片文件 + await input.Content.CopyToAsync(fs); + } + + if (input.ChunkNumber == input.TotalChunks) + { + 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).OrderBy(f => f.Length).ThenBy(f => f); + // 创建临时合并文件 + using var memoryStream = new MemoryStream(); + foreach (var mergeFile in mergeFiles) + { + // 读取当前文件字节 + var mergeFileBytes = await FileHelper.ReadAllBytesAsync(mergeFile); + // 写入到合并文件流 + await memoryStream.WriteAsync(mergeFileBytes, 0, mergeFileBytes.Length, cancellationToken); + Array.Clear(mergeFileBytes, 0, mergeFileBytes.Length); + // 删除已参与合并的临时文件分片 + FileHelper.DeleteIfExists(mergeFile); + } + createOssObjectInput.SetContent(memoryStream); + // 分离出合并接口,合并时计算上传次数 + await _fileUploadMerger.MergeAsync(createOssObjectInput); + // 文件保存之后删除临时文件目录 + Directory.Delete(tempFilePath, true); + } + } + catch + { + // 发生异常删除临时文件目录 + Directory.Delete(tempFilePath, true); + throw; + } + } + } +} 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 671c88bbe..81b84681e 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 @@ -1,60 +1,27 @@ -using LINGYUN.Abp.Features.LimitValidation; -using LINGYUN.Abp.OssManagement.Features; -using LINGYUN.Abp.OssManagement.Permissions; +using LINGYUN.Abp.OssManagement.Permissions; using Microsoft.AspNetCore.Authorization; -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.IO; using System.Threading.Tasks; -using Volo.Abp.Features; -using Volo.Abp.Validation; namespace LINGYUN.Abp.OssManagement { [Authorize(AbpOssManagementPermissions.OssObject.Default)] public class OssObjectAppService : OssManagementApplicationServiceBase, IOssObjectAppService { - protected IFileValidater FileValidater { get; } + protected FileUploadMerger Merger { get; } protected IOssContainerFactory OssContainerFactory { get; } public OssObjectAppService( - IFileValidater fileValidater, + FileUploadMerger merger, IOssContainerFactory ossContainerFactory) { - FileValidater = fileValidater; + Merger = merger; OssContainerFactory = ossContainerFactory; } [Authorize(AbpOssManagementPermissions.OssObject.Create)] - [RequiresFeature(AbpOssManagementFeatureNames.OssObject.UploadFile)] - [RequiresLimitFeature( - AbpOssManagementFeatureNames.OssObject.UploadLimit, - AbpOssManagementFeatureNames.OssObject.UploadInterval, - LimitPolicy.Month)] public virtual async Task CreateAsync(CreateOssObjectInput input) { - if (!input.Content.IsNullOrEmpty()) - { - await FileValidater.ValidationAsync(new UploadFile - { - TotalSize = input.Content.Length, - FileName = input.Object - }); - } - - var oss = CreateOssContainer(); - - var createOssObjectRequest = new CreateOssObjectRequest( - input.Bucket, - input.Object, - input.Content, - input.Path, - input.ExpirationTime) - { - Overwrite = input.Overwrite - }; - var ossObject = await oss.CreateObjectAsync(createOssObjectRequest); + var ossObject = await Merger.MergeAsync(input); return ObjectMapper.Map(ossObject); } @@ -88,14 +55,5 @@ namespace LINGYUN.Abp.OssManagement { return OssContainerFactory.Create(); } - - 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/PrivateFileAppService.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/PrivateFileAppService.cs index 0ea4227ba..d97059e73 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 @@ -14,11 +14,13 @@ namespace LINGYUN.Abp.OssManagement public class PrivateFileAppService : FileAppServiceBase, IPrivateFileAppService { public PrivateFileAppService( + IFileUploader fileUploader, IFileValidater fileValidater, IOssContainerFactory ossContainerFactory) - : base(fileValidater, ossContainerFactory) + : base(fileUploader, fileValidater, ossContainerFactory) { } + protected override string GetCurrentBucket() { return "users"; 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 0d802e7f8..d92642ede 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 @@ -3,11 +3,13 @@ public class PublicFileAppService : FileAppServiceBase, IPublicFileAppService { public PublicFileAppService( - IFileValidater fileValidater, - IOssContainerFactory ossContainerFactory) - : base(fileValidater, ossContainerFactory) + IFileUploader fileUploader, + IFileValidater fileValidater, + IOssContainerFactory ossContainerFactory) + : base(fileUploader, fileValidater, ossContainerFactory) { } + protected override string GetCurrentBucket() { return "public"; 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 0a62581c2..1b14d70df 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 @@ -109,7 +109,6 @@ namespace LINGYUN.Abp.OssManagement.FileSystem { ThrowOfPathHasTooLong(filePath); - FileMode fileMode = request.Overwrite ? FileMode.Create : FileMode.CreateNew; if (!request.Overwrite && File.Exists(filePath)) { throw new BusinessException(code: OssManagementErrorCodes.ObjectAlreadyExists); @@ -118,6 +117,7 @@ namespace LINGYUN.Abp.OssManagement.FileSystem DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath)); + FileMode fileMode = request.Overwrite ? FileMode.Create : FileMode.CreateNew; using (var fileStream = File.Open(filePath, fileMode, FileAccess.Write)) { await request.Content.CopyToAsync(fileStream); 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 9b3a46557..d9aea7344 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,17 +1,10 @@ using LINGYUN.Abp.OssManagement.Permissions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.IO; -using System.Linq; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Auditing; -using Volo.Abp.IO; -using Volo.Abp.Validation; namespace LINGYUN.Abp.OssManagement { @@ -20,14 +13,14 @@ namespace LINGYUN.Abp.OssManagement [Route("api/oss-management/objects")] public class OssObjectController : AbpController, IOssObjectAppService { - protected IFileValidater FileValidater { get; } + protected IFileUploader FileUploader { get; } protected IOssObjectAppService OssObjectAppService { get; } public OssObjectController( - IFileValidater fileValidater, + IFileUploader fileUploader, IOssObjectAppService ossObjectAppService) { - FileValidater = fileValidater; + FileUploader = fileUploader; OssObjectAppService = ossObjectAppService; } @@ -43,74 +36,18 @@ namespace LINGYUN.Abp.OssManagement [Authorize(AbpOssManagementPermissions.OssObject.Create)] public virtual async Task UploadAsync([FromForm] UploadOssObjectInput input) { - await FileValidater.ValidationAsync(input); - // 以上传的文件名创建一个临时目录 - var tempFilePath = Path.Combine( - Path.GetTempPath(), - "lingyun-abp-application", - "upload-tmp", - string.Concat(input.Path ?? "", input.FileName).ToMd5()); - DirectoryHelper.CreateIfNotExists(tempFilePath); - // 以上传的分片索引创建临时文件 - var tempSavedFile = Path.Combine(tempFilePath, $"{input.ChunkNumber}.uploadtmp"); - try + await FileUploader.UploadAsync(new UploadFileChunkInput { - if (HttpContext.RequestAborted.IsCancellationRequested) - { - // 如果取消请求,删除临时目录 - Directory.Delete(tempFilePath, true); - return; - } - - if (input.File != null) - { - // 保存临时文件 - using (var fs = new FileStream(tempSavedFile, FileMode.Create, FileAccess.Write)) - { - // 写入当前分片文件 - await input.File.CopyToAsync(fs); - } - } - - if (input.ChunkNumber == input.TotalChunks) - { - 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).OrderBy(f => f.Length).ThenBy(f => f); - // 创建临时合并文件 - using (var memoryStream = new MemoryStream()) - { - foreach (var mergeFile in mergeFiles) - { - // 读取当前文件字节 - var mergeFileBytes = await FileHelper.ReadAllBytesAsync(mergeFile); - // 写入到合并文件流 - await memoryStream.WriteAsync(mergeFileBytes, HttpContext.RequestAborted); - Array.Clear(mergeFileBytes, 0, mergeFileBytes.Length); - // 删除已参与合并的临时文件分片 - FileHelper.DeleteIfExists(mergeFile); - } - createOssObjectInput.SetContent(memoryStream); - - await OssObjectAppService.CreateAsync(createOssObjectInput); - // 文件保存之后删除临时文件目录 - Directory.Delete(tempFilePath, true); - } - } - } - catch - { - // 发生异常删除临时文件目录 - Directory.Delete(tempFilePath, true); - throw; - } + 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); } [HttpDelete] @@ -131,14 +68,5 @@ namespace LINGYUN.Abp.OssManagement { return await OssObjectAppService.GetAsync(input); } - - 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.HttpApi/LINGYUN/Abp/OssManagement/PrivateFilesController.cs b/aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi/LINGYUN/Abp/OssManagement/PrivateFilesController.cs index 3466ee0ac..169707066 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 @@ -27,6 +27,23 @@ namespace LINGYUN.Abp.OssManagement LocalizationResource = typeof(AbpOssManagementResource); } + [HttpPost] + [Route("upload")] + public virtual async Task UploadAsync([FromForm] UploadOssObjectInput 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(), + }); + } + [HttpPost] [Route("{path}")] [Route("{path}/{name}")] @@ -40,7 +57,7 @@ namespace LINGYUN.Abp.OssManagement var file = Request.Form.Files[0]; var fileName = name ?? file.FileName; - var createOssObjectInput = new UploadPublicFileInput + var createOssObjectInput = new UploadFileInput { Path = path, Object = fileName, 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 4c0e4ce0c..314676f2b 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 @@ -27,6 +27,24 @@ namespace LINGYUN.Abp.OssManagement LocalizationResource = typeof(AbpOssManagementResource); } + + [HttpPost] + [Route("upload")] + public virtual async Task UploadAsync([FromForm] UploadOssObjectInput 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(), + }); + } + [HttpPost] [Route("{path}")] [Route("{path}/{name}")] @@ -40,7 +58,7 @@ namespace LINGYUN.Abp.OssManagement var file = Request.Form.Files[0]; var fileName = name ?? file.FileName; - var createOssObjectInput = new UploadPublicFileInput + var createOssObjectInput = new UploadFileInput { Path = path, Object = fileName, diff --git a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Program.cs b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Program.cs index 2788465a8..baa19b48b 100644 --- a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Program.cs +++ b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/Program.cs @@ -1,45 +1,45 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Hosting; -using Serilog; -using System; -using System.IO; - -namespace LINGYUN.Platform -{ - public class Program - { - public static int Main(string[] args) - { - try - { - var hostBuilder = CreateHostBuilder(args).Build(); - Log.Information("Starting Platform.Host."); - hostBuilder.Run(); - - return 0; - } - catch (Exception ex) - { - Log.Fatal(ex, "Host terminated unexpectedly!"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } - - internal static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) - .UseSerilog((context, provider, config) => - { - config.ReadFrom.Configuration(context.Configuration); - }) - .UseAutofac(); - } -} +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Serilog; +using System; +using System.IO; + +namespace LINGYUN.Platform +{ + public class Program + { + public static int Main(string[] args) + { + try + { + var hostBuilder = CreateHostBuilder(args).Build(); + Log.Information("Starting Platform.Host."); + hostBuilder.Run(); + + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Host terminated unexpectedly!"); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } + + internal static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }) + .UseSerilog((context, provider, config) => + { + config.ReadFrom.Configuration(context.Configuration); + }) + .UseAutofac(); + } +}