public async Task <IActionResult> Save() { string targetFilePath = null; BookDTO dto = null; if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType)) { return(BadRequest($"Requisição precisa ser 'multipart'.")); } var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), MaxBoundaryLengthLimit); var reader = new MultipartReader(boundary, HttpContext.Request.Body); var section = await reader.ReadNextSectionAsync(); while (section != null) { ContentDispositionHeaderValue contentDisposition; var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition); var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); if (hasContentDispositionHeader) { if (MultipartRequestHelper.HasFileContentDisposition(contentDisposition)) { if (key.ToString() == "file") { var imageValidator = new ImageValidator(); var fileName = HeaderUtilities.RemoveQuotes(contentDisposition.FileName).ToString(); var imageValidationResult = imageValidator.Validate(fileName); if (imageValidationResult.HasError) { return(BadRequest(imageValidationResult.ErrorMessage)); } targetFilePath = Path.GetTempFileName(); using (var targetStream = System.IO.File.Create(targetFilePath)) { await section.Body.CopyToAsync(targetStream); } } } else if (MultipartRequestHelper.HasFormDataContentDisposition(contentDisposition)) { if (key.ToString() == "value") { using (var streamReader = new StreamReader(section.Body)) { var json = await streamReader.ReadToEndAsync(); dto = JsonConvert.DeserializeObject <BookDTO>(json); } } } } section = await reader.ReadNextSectionAsync(); } var validationContext = new ValidationContext(bookFacade, authorService, publisherService); var bookValidator = new BookValidator(validationContext); var validationResult = bookValidator.Validate(dto); if (validationResult.HasError) { return(BadRequest(validationResult.ErrorMessage)); } var bookFound = await bookFacade.FindById(dto.Id); if (bookFound == null && dto.Id != 0) { return(NotFound($"Nenhum livro encontrado com o ID: {dto.Id}.")); } try { var book = dto.FromBookViewItem(new DefaultValidationResultDataLookUp(validationResult)); book = await bookFacade.Save(book, targetFilePath); return(Ok(await book.ToBookViewItem(serviceDataLookUp))); } catch (BookSaveException ex) { try { System.IO.File.Delete(targetFilePath); } catch { //Ignore } return(BadRequest(ex.Message)); } catch (ImageSaveException ex) { return(BadRequest(ex.Message)); } }