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()); }
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")); }