public virtual async Task <OssObjectDto> UploadAsync(string bucket, string path, string name, [FromForm] IFormFile file) { if (file == null || file.Length <= 0) { ThrowValidationException(L["FileNotBeNullOrEmpty"], "File"); } var createOssObjectInput = new CreateOssObjectInput { Bucket = HttpUtility.UrlDecode(bucket), Path = HttpUtility.UrlDecode(path), Object = name ?? file.FileName, Content = file.OpenReadStream(), Overwrite = true }; return(await _ossObjectAppService.CreateAsync(createOssObjectInput)); }
public virtual async Task <OssObjectDto> CreateAsync(CreateOssObjectInput input) { if (!input.Content.IsNullOrEmpty()) { // 检查文件大小 var fileSizeLimited = await SettingProvider .GetAsync( AbpOssManagementSettingNames.FileLimitLength, AbpOssManagementSettingNames.DefaultFileLimitLength); if (fileSizeLimited * 1024 * 1024 < input.Content.Length) { ThrowValidationException(L["UploadFileSizeBeyondLimit", fileSizeLimited], nameof(input.Content)); } // 文件扩展名 var fileExtensionName = FileHelper.GetExtension(input.Object); var fileAllowExtension = await SettingProvider.GetOrNullAsync(AbpOssManagementSettingNames.AllowFileExtensions); // 检查文件扩展名 if (!fileAllowExtension.Split(',') .Any(fe => fe.Equals(fileExtensionName, StringComparison.CurrentCultureIgnoreCase))) { ThrowValidationException(L["NotAllowedFileExtensionName", fileExtensionName], "FileName"); } } 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); return(ObjectMapper.Map <OssObject, OssObjectDto>(ossObject)); }
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 { 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; } }
public virtual async Task <OssObjectDto> CreateAsync(CreateOssObjectInput input) { return(await OssObjectAppService.CreateAsync(input)); }