6

I am trying to resize the uploaded image from S3 using @aws-sdk/v3 in Node.js API.

First, I get the object (image) from S3 as shown here: https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/javascriptv3/example_code/s3/src/s3_getobject.ts

...

  const params = { Bucket: AWS_BUCKET_NAME, Key: key }
  const data = await s3.send(new GetObjectCommand(params))
  console.log(` >> Success, bucket returned:`, data) // Log correctly

Then I try to resize the data (image):

  const convert = sharp(data).resize(size, size).webp()

But it throws:

 >> data.type: object
(node:35583) UnhandledPromiseRejectionWarning: Error: Input file is missing
...

And I am not sure how should I upload it back?

What am I doing wrong?

halfer
  • 19,824
  • 17
  • 99
  • 186
Swix
  • 1,883
  • 7
  • 33
  • 50

2 Answers2

2

I think the sharp constructor accepts a buffer, but what you're passing it is the entire response from the SDK request. Instead, try passing data.Body to sharp fn like this:

const convert = sharp(data.Body).resize(size, size).webp();

Mu-Majid
  • 851
  • 1
  • 9
  • 16
0

data.Body is of type Readable (a readable stream)

You can use a stream directly with sharp (see stream example on sharp readme)

In your case this gives:

  const params = { Bucket: AWS_BUCKET_NAME, Key: key }
  const data = await s3.send(new GetObjectCommand(params))

  const converter = await sharp().resize(size, size).webp()
  const resizedBody = (data.Body as Readable).pipe(converter);
Chris
  • 1,016
  • 1
  • 14
  • 18