public async Task <(bool Success, UploadFileResult Result, string ErrorMessage)> Process(IQueryCollection query, IFormCollection form, IHeaderDictionary headers, Stream fileStream, string extensionName, string localFileName, string sectionName, HttpRequest request)
        {
            var(success, errorMsg, fileSignature) = await FileValidator.Validate(localFileName, fileStream);

            if (!success)
            {
                return(false, null, errorMsg);
            }

            var subDir = await SubdirectoryGenerator.Generate(query, form, headers, extensionName, request);

            var folder = Path.Combine(Configure.RootDirectory, subDir);

            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }
            var fileName = await FileNameGenerator.Generate(query, form, headers, extensionName, request) + extensionName;

            var url = Path.Combine(folder, fileName).Replace("\\", "/");

            await using var stream = new MemoryStream();
            if (fileSignature != null && fileSignature.Length > 0)
            {
                stream.Write(fileSignature, 0, fileSignature.Length);
            }
            await fileStream.CopyToAsync(stream, Configure.BufferSize);

            stream.Seek(0, SeekOrigin.Begin);
            var fileBytes = new byte[stream.Length];
            await stream.ReadAsync(fileBytes);

            var req = new PutObjectRequest(Configure.Bucket, url, fileBytes);

            var resp = Client.PutObject(req);

            if (resp.httpCode != 200)
            {
                return(false, null, resp.httpMessage);
            }
            var serverPath = "/" + url;

            try
            {
                var callback = request.HttpContext.RequestServices.GetService <IUploadCompletedCallbackHandler>();
                if (callback != null)
                {
                    await callback.OnCompletedAsync(serverPath, localFileName, request);
                }
            }
            catch
            {
                // ignored
            }
            return(true, new UploadFileResult {
                Name = sectionName, Url = serverPath
            }, "");
        }
Exemple #2
0
        public async Task <(bool Success, UploadFileResult Result, string ErrorMessage)> Process(IQueryCollection query, IFormCollection form, IHeaderDictionary headers, Stream fileStream, string extensionName, string localFileName, string sectionName, HttpRequest request)
        {
            var(success, errorMsg, fileSignature) = await FileValidator.Validate(localFileName, fileStream);

            if (!success)
            {
                return(false, null, errorMsg);
            }
            var subDir = await SubdirectoryGenerator.Generate(query, form, headers, extensionName, request);

            var folder = Path.Combine(Configure.RootDirectory, subDir);

            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }
            var fileName = await FileNameGenerator.Generate(query, form, headers, extensionName, request) + extensionName;

            var url = Path.Combine(folder, fileName);

            await using var writeStream = File.Create(url);
            if (fileSignature != null && fileSignature.Length > 0)
            {
                writeStream.Write(fileSignature, 0, fileSignature.Length);
            }
            await fileStream.CopyToAsync(writeStream, Configure.BufferSize);

            var serverFileName = Path.Combine("/", subDir, fileName).Replace("\\", "/");

            try
            {
                var callback = request.HttpContext.RequestServices.GetService <IUploadCompletedCallbackHandler>();
                if (callback != null)
                {
                    await callback.OnCompletedAsync(serverFileName, localFileName, request);
                }
            }
            catch
            {
                // ignored
            }

            return(true, new UploadFileResult {
                Name = sectionName, Url = serverFileName
            }, "");
        }
        public async Task <(bool Success, UploadFileResult Result, string ErrorMessage)> Process(IQueryCollection query, IFormCollection form, IHeaderDictionary headers, Stream fileStream, string extensionName, string localFileName, string sectionName, HttpRequest request)
        {
            var(success, errorMsg, fileSignature) = await FileValidator.Validate(localFileName, fileStream);

            if (!success)
            {
                return(false, null, errorMsg);
            }

            var subDir = await SubdirectoryGenerator.Generate(query, form, headers, extensionName, request);

            var folder = Path.Combine(Configure.RootDirectory, subDir);

            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }
            var fileName = await FileNameGenerator.Generate(query, form, headers, extensionName, request) + extensionName;

            var url = Path.Combine(folder, fileName).Replace("\\", "/");

            await using var stream = new MemoryStream();
            if (fileSignature != null && fileSignature.Length > 0)
            {
                stream.Write(fileSignature, 0, fileSignature.Length);
            }
            await fileStream.CopyToAsync(stream, Configure.BufferSize);

            stream.Seek(0, SeekOrigin.Begin);
            if (!Configure.Metadata.TryGetValue(extensionName, out var meta))
            {
                meta = new ObjectMetadata {
                    ContentType = "application/octet-stream"
                };
            }

            meta.ContentDisposition = meta.ContentDisposition.Resolve(query, form, localFileName, sectionName);
            if (meta.UserMetadata != null)
            {
                foreach (var(key, _) in meta.UserMetadata)
                {
                    meta.UserMetadata[key] = meta.UserMetadata[key].Resolve(query, form, localFileName, sectionName);
                }
            }

            Client.PutObject(Configure.BucketName, url, stream, meta);

            var serverPath = "/" + url;

            try
            {
                var callback = request.HttpContext.RequestServices.GetService <IUploadCompletedCallbackHandler>();
                if (callback != null)
                {
                    await callback.OnCompletedAsync(serverPath, localFileName, request);
                }
            }
            catch
            {
                // ignored
            }

            return(true, new UploadFileResult {
                Name = sectionName, Url = serverPath
            }, "");
        }