Search code examples
node.jsamazon-s3aws-sdkaws-sdk-nodejs

How to save file from S3 using aws-sdk v3


With the new aws-sdk v3, specifically @aws-sdk/client-s3, it's not clear to me how to store files to disk from S3.
Having the following code

const { Body } = await s3.send(new GetObjectCommand({
  Bucket: 'myBucket',
  Key: 'myKey',
}))

The Body can be of type Readable | ReadableStream | Blob.
I'd like to store this into a file on disk. Since the return types are completely different, is there an easy way to e.g. get a Buffer or Stream.Readable from aws-sdk?

In aws-sdk v2 it was easy with .createReadStream() function which seems to no longer exist.


Solution

  • It appears ReadableStream | Blob is available only in browser. Node.js always gets Readable which is what I need.

    The solution is pretty straightforward afterwards with fs.createWriteStream and piping the Readable such as

    await new Promise((resolve, reject) => {
      Body.pipe(fs.createWriteStream(filePath))
        .on('error', err => reject(err))
        .on('close', () => resolve())
    })
    

    For reference, here's an issue where improvement to documentation is discussed https://github.com/aws/aws-sdk-js-v3/issues/1877