public async Task <APIGatewayProxyResponse> GetImageAsync(APIGatewayProxyRequest request, ILambdaContext context) { var id = request.PathParameters["id"]; var response = new APIGatewayProxyResponse(); var image = await _ddbService.GetByIdAsync <ScreenImage>(id); if (image == null) { response.StatusCode = (int)HttpStatusCode.NotFound; return(response); } response.StatusCode = (int)HttpStatusCode.OK; response.Headers = _defaultHeaders; response.Body = JsonSerializer.Serialize(image); return(response); }
public async Task <string> ProcessImage(S3Event evnt, ILambdaContext context) { var s3Event = evnt.Records?[0].S3; if (s3Event == null) { context.Logger.LogLine("ERROR: Could not get S3 Event Data"); return(null); } try { var objMetadata = await _s3Client.GetObjectMetadataAsync(s3Event.Bucket.Name, s3Event.Object.Key); var imageId = objMetadata.Metadata["x-amz-meta-imageid"]; var imageType = objMetadata.Metadata["x-amz-meta-imagetype"]; context.Logger.LogLine($"Processing image {s3Event.Object.Key}. ImageType: {imageType ?? "unknown"}"); // Copy the file from the upload folder var originalSizeKey = GetResizedFileKey(s3Event.Object.Key); await _s3Client.CopyObjectAsync(s3Event.Bucket.Name, s3Event.Object.Key, s3Event.Bucket.Name, originalSizeKey); // Ideally, we would use the stream instead, but couldn't figure out how to get // it to re-use the same stream byte[] imageBytes = null; var imageContentType = ""; using (var objectResp = await _s3Client.GetObjectAsync(s3Event.Bucket.Name, s3Event.Object.Key)) using (var ms = new MemoryStream()) { imageContentType = objectResp.Headers.ContentType; await objectResp.ResponseStream.CopyToAsync(ms); imageBytes = ms.ToArray(); } var imageTypeSizes = _sizes.Where(x => x.ImageType == imageType); foreach (var imgSize in imageTypeSizes) { context.Logger.LogLine($"... Resizing to {imgSize.Key}"); IImageFormat imageFormat; using (var image = Image.Load(imageBytes, out imageFormat)) { var resizedFileKey = GetResizedFileKey(s3Event.Object.Key, imgSize.Key); using (var outStream = new MemoryStream()) { image.Mutate(x => x.Resize(new ResizeOptions { Mode = ResizeMode.Max, // TODO: allow each profile to specify method used Position = AnchorPositionMode.Center, Size = new Size(imgSize.Width, imgSize.Height) })); image.Save(outStream, imageFormat); var putObjectRequest = new PutObjectRequest { Key = resizedFileKey, BucketName = s3Event.Bucket.Name, ContentType = imageContentType, InputStream = outStream }; await _s3Client.PutObjectAsync(putObjectRequest); } } context.Logger.LogLine($"... Resized and saved file '{s3Event.Object.Key}' to '{imgSize.Key}'"); } var imageRecord = await _ddbService.GetByIdAsync <ScreenImage>(imageId); if (imageRecord != null) { imageRecord.IsPublished = true; await _ddbService.SaveAsync(imageRecord); } // Delete the original await _s3Client.DeleteObjectAsync(s3Event.Bucket.Name, s3Event.Object.Key); return("Ok"); } catch (Exception ex) { context.Logger.LogLine($"Error processing image s3://{s3Event.Bucket.Name}/{s3Event.Object.Key}. Error: {ex.Message}"); context.Logger.LogLine(ex.StackTrace); throw; } }