Skip to content

Commit 556ae96

Browse files
Lambda to allow gif types (#1143)
* Update to allow gif types * Update cdk/lambdas/uploadResize/index.js
1 parent a30156b commit 556ae96

2 files changed

Lines changed: 27 additions & 14 deletions

File tree

cdk/lambdas/avatarResize/index.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ exports.handler = async (event) => {
1111
const bucket = event.Records[0].s3.bucket.name;
1212
const key = event.Records[0].s3.object.key;
1313

14-
console.log({ bucket, key });
15-
1614
try {
1715
// Check if the image has already been resized
1816
const headParams = {
@@ -21,10 +19,10 @@ exports.handler = async (event) => {
2119
};
2220

2321
const headResponse = await s3.send(new HeadObjectCommand(headParams));
24-
const metadata = headResponse.Metadata || {};
22+
const s3Metadata = headResponse.Metadata || {};
2523
const contentType = headResponse.ContentType;
2624

27-
if (metadata.resized === "true") {
25+
if (s3Metadata.resized === "true") {
2826
return {
2927
statusCode: 200,
3028
body: JSON.stringify({ message: "Image already resized. Skipping." }),
@@ -39,14 +37,13 @@ exports.handler = async (event) => {
3937

4038
const response = await s3.send(new GetObjectCommand(getParams));
4139
const stream = response.Body;
42-
console.log({ response, stream });
40+
4341
if (!stream) throw new Error("BodyStream is empty");
4442

4543
const imageBuffer = Buffer.concat(await stream.toArray());
46-
const sharpImage = sharp(imageBuffer);
4744

4845
// Resize the image
49-
const resizedImageBuffer = await sharpImage
46+
const resizedImageBuffer = await sharp(imageBuffer)
5047
.resize({ width: 220, height: 220, fit: "cover" })
5148
.toBuffer();
5249

@@ -56,7 +53,7 @@ exports.handler = async (event) => {
5653
Bucket: bucket,
5754
Key: key,
5855
Body: resizedImageBuffer,
59-
Metadata: { ...metadata, resized: "true" },
56+
Metadata: { ...s3Metadata, resized: "true" },
6057
ContentType: contentType,
6158
}),
6259
);

cdk/lambdas/uploadResize/index.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,32 +61,48 @@ exports.handler = async (event) => {
6161

6262
const imageRaw = Buffer.concat(await stream.toArray());
6363

64+
// Determine the image format
65+
const imageMetadata = await sharp(imageRaw).metadata();
66+
const isGif = imageMetadata.format === "gif";
67+
6468
// Function to resize an image
6569
const resizeImage = async (buffer, size) => {
66-
return sharp(buffer)
67-
.resize({
70+
try {
71+
const resizedImage = sharp(buffer).resize({
6872
width: size.maxWidth,
6973
height: size.maxHeight,
7074
fit: "inside",
7175
withoutEnlargement: false,
72-
})
73-
.webp({ quality: 80 })
74-
.toBuffer();
76+
});
77+
78+
if (isGif) {
79+
return resizedImage.gif().toBuffer();
80+
} else {
81+
return resizedImage.webp({ quality: 80 }).toBuffer();
82+
}
83+
} catch (error) {
84+
console.error(`Error resizing image to ${size.maxWidth}x${size.maxHeight}:`, error);
85+
throw error;
86+
}
7587
};
7688

7789
// Loop through sizes and upload each resized image
7890
for (const size of sizes) {
7991
const resizedImage = await resizeImage(imageRaw, size);
8092

8193
const resizedKey = size.suffix
82-
? key.replace(/(\.[\w\d_-]+)$/i, `_${size.suffix}$1`)
94+
? key.replace(
95+
/(\.[\w\d_-]+)$/i,
96+
`_${size.suffix}${isGif ? ".gif" : ".webp"}`,
97+
)
8398
: key;
8499

85100
await s3.send(
86101
new PutObjectCommand({
87102
Bucket: bucket,
88103
Key: resizedKey,
89104
Body: resizedImage,
105+
ContentType: isGif ? "image/gif" : "image/webp",
90106
}),
91107
);
92108
}

0 commit comments

Comments
 (0)