首页 > 解决方案 > 单独获取 AWS S3 文件并加入它们?

问题描述

每天,我从 S3 下载几个大文件。
我只使用getObject功能。

有时,我担心我的代码内存超出限制。

是否可以单独获取文件s3并合并它们?

我附上我当前的代码以帮助理解。

const AWS = require('aws-sdk');
const fs  = require('fs');

function getOneFile() {
    AWS.config.update({
        accessKeyId: "",
        secretAccessKey: "",
        region: "",
        endpoint: ""
    });

    var s3 = new AWS.S3();

    var params = {
        Bucket: "bucket-name",
        Key: "key"
    };

    // If file size is too big,
    // How can I change under code?
    s3.getObject(params, function (err, data) {
        if(err) {
            console.log(err);
        } else {
            fs.writeFileSync("downloads/saveName.txt", data.Body.toString());
        }
    });
}

标签: node.jsamazon-web-servicesamazon-s3

解决方案


在 Node.js 中处理大文件的典型方法是利用Streams。您将获得一个 ReadableStream,使用fs.createWriteStreampipe(或者,最好是pipeline)创建一个 WritableStream - 这在流的 API 文档中得到了很好的解释。

现在,问题仍然存在:我们如何让 AWS 开发工具包返回一个 ReadableStream 而不是一个大缓冲区?

API 参考记录了您在响应 s3.getObject 时获得的回调参数,如下所示:

Body — (Buffer(Node.js), Typed Array(Browser), ReadableStream)
Object data.

这是非常无用的,并且似乎表明您可以获得几种不同类型的 Body 作为回调参数 - Buffer 或 ReadableStream,但不清楚如何选择您想要的。

但是,AWS.Request(基类)有一个.createReadStream()方法,应该做你想做的事: https ://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html#createReadStream-property

这是一个现有的 StackOverflow 答案和一个使用示例: https ://stackoverflow.com/a/65683054/6098312


推荐阅读