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));
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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;
            }
        }
Exemplo n.º 4
0
 public virtual async Task <OssObjectDto> CreateAsync(CreateOssObjectInput input)
 {
     return(await OssObjectAppService.CreateAsync(input));
 }