public async Task <IActionResult> UploadFiles(int userId, [FromForm] FileDescriptionDto fileDescriptionDto) { var file = fileDescriptionDto?.File; bool isTranffered = false; if (file?.Length > 0) { try { var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.ToString().Trim('"'); fileDescriptionDto.FileName = fileDescriptionDto.Description = fileName; fileDescriptionDto.ContentType = file.ContentType; isTranffered = await file.SaveAsAsync(Path.Combine(_options.Value.ServerUploadFolder, fileName)); } catch (Exception ex) when(ex.InnerException is TimeoutException) { // [To Do] implement retry mechanism if fails to send the stream //file.RetrySaveAsync(SD.Retry) } // getting User if (isTranffered) { var userFromRepo = await _repository.GetUser(userId); if (userFromRepo == null) { return(BadRequest()); } var fileDesc = _mapper.Map <FileDescription>(fileDescriptionDto); userFromRepo.FileDescriptions.Add(fileDesc); if (await _repository.SaveAll()) { var fileForRerurn = _mapper.Map <FileDescriptionForResultDto>(fileDesc); return(CreatedAtRoute("GetFileDesc", new { userId = fileDesc.UserId, id = fileDesc.Id }, fileForRerurn)); } } } return(BadRequest("failed while saving the file")); }
public async Task <ActionResult> UploadCsv(int userId, [FromForm] FileDescriptionDto fileDescriptionDto) { List <AnonymousUser> anonymousUsers = new List <AnonymousUser>(); var serviceDbContext = HttpContext.RequestServices.GetRequiredService <ApplicationDbContext>(); long fileSize = 0; using (var transaction = serviceDbContext.Database.BeginTransaction()) { try { using (var fileStream = fileDescriptionDto.File.OpenReadStream()) using (var reader = new StreamReader(fileStream, Encoding.Default)) using (var csv = new CsvReader(reader, System.Globalization.CultureInfo.CurrentCulture)) { //getting filename and contentType var fileName = ContentDispositionHeaderValue.Parse(fileDescriptionDto.File?.ContentDisposition).FileName.ToString().Trim('"'); fileDescriptionDto.FileName = fileDescriptionDto.Description = fileName; fileDescriptionDto.ContentType = fileDescriptionDto.File?.ContentType; fileSize = fileDescriptionDto.File.Length; //mapping csv file to class table schema csv.Configuration.RegisterClassMap <UserDtoCsvMap>(); var records = csv.GetRecords <AnonymousUser>().ToList(); //adding import file var userFromRepo = await _repository.GetUser(userId); var importFileMap = _mapper.Map <ImportFileDescription>(fileDescriptionDto); userFromRepo.ImportFileDescriptions.Add(importFileMap); if (await _repository.SaveAll()) { //import file processing... var importedFiledescFromRepo = await _repository.GetImportedFileDescription(importFileMap.Id); foreach (var record in records) { record.ImportFileDescription = importedFiledescFromRepo; } anonymousUsers = records; _repository.AddFileRange <AnonymousUser>(records, fileSize); if (await _repository.SaveAll()) { var fileForReturn = _mapper.Map <FileDescriptionForResultDto>(importedFiledescFromRepo); await transaction.CommitAsync(); return(CreatedAtRoute("GetFileDesc", new { userId = importedFiledescFromRepo.UserId, id = importedFiledescFromRepo.Id }, fileForReturn)); } } } } catch (Exception ex) when(ex.Message.Equals("The operation has timed out.")) { // [To Do]implement retry mechanism if fails to send the stream var retryResult = await RetryHelper.RetryOnExceptionAsync(SD.Retry, TimeSpan.FromSeconds(10), async() => { return(await SaveRetry(anonymousUsers)); }); if (retryResult) { await transaction.CommitAsync(); return(Ok("data has been imported via retry mechanism")); } await transaction.RollbackAsync(); return(BadRequest(ex.Message)); } await transaction.RollbackAsync(); } return(BadRequest("Error occured while dumping the data into data base")); }
/// <summary> /// Create new file description instance. /// </summary> /// <param name="dto">File description dto.</param> public FileDescription(FileDescriptionDto dto) : this(dto.Id, dto.Size, dto.Name) { }