public async Task <IActionResult> Post([FromForm] FilesUpload filesToUpload, CancellationToken cancellationToken)
        {
            if (filesToUpload?.Files == null)
            {
                return(BadRequest("No file found to upload"));
            }

            long size = filesToUpload.Files.Sum(f => f?.Length ?? 0);

            if (size == 0)
            {
                return(BadRequest("No file found to upload"));
            }

            foreach (var formFile in filesToUpload.Files)
            {
                var fileTempPath = @$ "{Path.GetTempPath()}{formFile.FileName}";

                using (var stream = new FileStream(fileTempPath, FileMode.Create, FileAccess.Write))
                {
                    await formFile.CopyToAsync(stream, cancellationToken);
                }

                var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
                cts.CancelAfter(TimeSpan.FromSeconds(3));

                try
                {
                    var fileWritten = await _fileProcessingChannel.AddFileAsync(fileTempPath, cts.Token);

                    if (!fileWritten)
                    {
                        _logger.LogError($"An error occurred when processing file: {formFile.FileName}");
                        return(StatusCode(500, $"An error occurred when processing file: {formFile.FileName}"));
                    }
                }
                catch (OperationCanceledException) when(cts.IsCancellationRequested)
                {
                    System.IO.File.Delete(fileTempPath);
                    throw;
                }
            }

            return(Ok());
        }
예제 #2
0
        public async Task <IActionResult> FileUploadV2(IFormFile file, CancellationToken cancellationToken)
        {
            var sw = Stopwatch.StartNew();

            if (file is object && file.Length > 0)
            {
                var fileName = Path.GetTempFileName();

                using (var stream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                {
                    await file.CopyToAsync(stream, cancellationToken);
                }

                var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
                cts.CancelAfter(TimeSpan.FromSeconds(3)); // wait max 3 seconds

                try
                {
                    var fileWritten = await _fileProcessingChannel.AddFileAsync(fileName, cts.Token);

                    if (fileWritten)
                    {
                        sw.Stop();

                        _logger.LogInformation($"Time for result upload was {sw.ElapsedMilliseconds}ms.");

                        return(RedirectToAction("UploadComplete"));
                    }
                }
                catch (OperationCanceledException) when(cts.IsCancellationRequested)
                {
                    System.IO.File.Delete(fileName); // Delete the temp file to cleanup
                }
            }

            return(RedirectToAction("UploadFailed"));
        }