public async Task <ActionResult> FileUploads(IFormFileCollection files, CancellationToken cancellationToken = default) { if (files.Count == 0) { files = Request.Form.Files; } if (files.Count == 0) { return(BadRequest("No files detected")); } // convert to pdfs using var scope = _serviceProvider.CreateScope(); var pdfProcessor = scope.ServiceProvider.GetRequiredService <IPdfProcessor>(); var filesToUpload = await pdfProcessor.RenderPdfs(files, cancellationToken); var concurrentCollection = new StreamConcurrentCollection(filesToUpload); await _bucketRepository.UploadFiles(_awsSetting.BucketName, concurrentCollection, cancellationToken); //TempData["files"] = JsonConvert.SerializeObject(filesToUpload); _bucketRepository.Dispose(); concurrentCollection.Dispose(); concurrentCollection.Clear(); var result = filesToUpload.Select(f => f.Name).ToList(); return(Ok(result)); //return RedirectToAction("UploadComplete"); }
public async Task UploadFiles(string bucketName, StreamConcurrentCollection files, CancellationToken cancellationToken) { try { var stopWatch = new Stopwatch(); stopWatch.Start(); var tasks = files.items.AsParallel() .WithCancellation(cancellationToken) .WithDegreeOfParallelism(5).Select(file => { var request = new TransferUtilityUploadRequest { BucketName = bucketName, InputStream = file.blob, Key = file.Name, AutoCloseStream = true }; return(transferUtility.UploadAsync(request, cancellationToken)); }); var finalTask = Task.WhenAll(tasks); await finalTask; stopWatch.Stop(); _logger.LogInformation($"{nameof(BucketRepository)} took {stopWatch.ElapsedMilliseconds/1000} sec"); } catch (AmazonS3Exception ex) { _logger.LogCritical(ex.Message, ex.InnerException); throw; } }