public async Task <IActionResult> AddServiceImage([FromForm] ServiceImageRequest request) { try { await _serviceImageUseCase.ExecuteCreate(request).ConfigureAwait(false); return(Ok()); } catch (UseCaseException e) { return(BadRequest(e)); } }
public async Task ExecuteCreate(ServiceImageRequest request) { var fileInfo = await _repositoryGateway.UploadImage(request).ConfigureAwait(false); if (fileInfo != null) { try { _servicesGateway.AddFileInfo(request.ServiceId, fileInfo); } catch (Exception e) { LoggingHandler.LogError(e.Message); LoggingHandler.LogError(e.StackTrace); throw; } } }
public async Task <Infrastructure.File> UploadImage(ServiceImageRequest request) { var fileExtension = Path.GetExtension(request.Image.FileName); var putObjectRequest = new PutObjectRequest(); var originalFileName = $"{request.ServiceId.ToString()}-original{fileExtension}"; var resizedFileName = $"{request.ServiceId.ToString()}-medium{fileExtension}"; putObjectRequest.BucketName = _repositoryBucket; putObjectRequest.Key = _imagesFolder + "/" + originalFileName; putObjectRequest.InputStream = request.Image.OpenReadStream(); try { await _s3Client.PutObjectAsync(putObjectRequest).ConfigureAwait(false); } catch (Exception e) { LoggingHandler.LogError(e.Message); LoggingHandler.LogError(e.StackTrace); throw; } // Use ImageSharper to resize image and save resized version to S3 // memory stream using (var memoryStream = new MemoryStream()) // Open the file automatically detecting the file type to decode it. // Our image is now in an uncompressed, file format agnostic, structure in-memory as // a series of pixels. using (Image image = Image.Load(request.Image.OpenReadStream())) { // Resize the image in place and return it for chaining. // 'x' signifies the current image processing context. image.Mutate(x => x.Resize(image.Width / 2, image.Height / 2)); var encoder = new JpegEncoder() { Quality = 30 //Use variable to set between 5-30 based on your requirements }; // The library automatically picks an encoder based on the file extension then // encodes and write the data to disk. // You can optionally set the encoder to choose. image.Save(memoryStream, encoder); putObjectRequest.Key = _imagesFolder + "/" + resizedFileName; putObjectRequest.InputStream = memoryStream; try { await _s3Client.PutObjectAsync(putObjectRequest).ConfigureAwait(false); } catch (Exception e) { LoggingHandler.LogError(e.Message); LoggingHandler.LogError(e.StackTrace); throw; } }// Dispose - releasing memory into a memory pool ready for the next image you wish to process. var fileEntity = new Infrastructure.File(); fileEntity.Url = $"{_imagesBaseUrl}/{_imagesFolder}/{originalFileName};{_imagesBaseUrl}/{_imagesFolder}/{resizedFileName}"; fileEntity.CreatedAt = DateTime.Now; return(fileEntity); }