【问题标题】:Get AWS S3 file separately and join them?单独获取 AWS S3 文件并加入它们?
【发布时间】:2021-03-25 18:30:40
【问题描述】:

每天,我都会从 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.js amazon-web-services amazon-s3


    【解决方案1】:

    在 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

    【讨论】:

      猜你喜欢
      • 2014-01-20
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多