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.
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