NodeJS 如何使用aws-sdk v3从S3保存文件

lvjbypge  于 2023-05-06  发布在  Node.js
关注(0)|答案(4)|浏览(249)

对于新的aws-sdk v3,特别是@aws-sdk/client-s3,我不清楚如何将文件从S3存储到磁盘。
具有以下代码

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

Body可以是Readable | ReadableStream | Blob类型。
我想把这个存到磁盘上的一个文件里。由于返回类型完全不同,有没有一种简单的方法来例如。从aws-sdk获取BufferStream.Readable
在aws-sdk v2中,.createReadStream()函数似乎不再存在。

68de4m5k

68de4m5k1#

ReadableStream | Blob仅在浏览器中可用。Node.js总是得到我需要的Readable
解决方案非常简单,然后使用fs.createWriteStream和管道Readable,如

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

作为参考,这里有一个讨论文档改进的问题https://github.com/aws/aws-sdk-js-v3/issues/1877

pxq42qpu

pxq42qpu2#

要在typescript中完成此操作,您还可以执行

await new Promise((resolve, reject) => {
 if (Body instanceof Readable) {
   Body.pipe(fs.createWriteStream(filePath))
    .on('error', err => reject(err))
    .on('close', () => resolve())
 }
});
8dtrkrch

8dtrkrch3#

GetObjectCommand返回可读流,我们使用fs模块创建writeStream,并将GetObjectCommand返回的readableStream传递给writeStream保存文件

const fs = require('fs');
const { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3');

const s3Client = new S3Client({
  region: 'your_region',
  credentials: { accessKeyId: 'your_accessKeyId', secretAccessKey: 'your_secretAccessKey' },
});

const bucketParams = {
  Bucket: 'your_bucket',
  Key: 'your_key.jpg',
};

const run = async () => {
  try {
    const data = await s3Client.send(new GetObjectCommand(bucketParams));
    const inputStream = data.Body;
    const downloadPath = 'example.png';
    const outputStream = fs.createWriteStream(downloadPath);
    inputStream.pipe(outputStream);
    outputStream.on('finish', () => {
      console.log(`downloaded the file successfully`);
    });
  } catch (err) {
    console.log('Error', err);
  }
};
qyswt5oh

qyswt5oh4#

你可以使用上面提到的流方法,但你也可以只使用fs/promises库中的writeFile方法:

const { writeFile } = require("node:fs/promises");
const { S3Client, GetObjectCommand } = require("@aws-sdk/client-s3");

const downloadFile = async () => {
    const command = new GetObjectCommand({ Bucket, Key });
    const { Body } = await client.send(command);

    const localFilename = "path_to_where_to_save_file";

    await writeFile(localFilename, Body);
}

然后调用这个函数。
我认为这是从node版本v14.18.0开始的,因为这个方法接受流作为输入。

相关问题