【问题标题】:Download AWS S3 file directly to a directory将 AWS S3 文件直接下载到目录
【发布时间】:2019-01-20 09:03:18
【问题描述】:

我想自动将从 AWS S3 下载的文件保存到我的应用程序文件夹。现在这可以手动完成。代码如下:

    router.get("/download", (req, res) => {
    //File S3 URL
    var fileKey =
        "key";

    AWS.config.update({
        accessKeyId: IAM_USER_KEY,
        secretAccessKey: IAM_USER_SECRET,
        Bucket: BUCKET_NAME
    });

    var s3 = new AWS.S3();
    var file = fs.createWriteStream("test.csv");

    var options = {
        Bucket: "name",
        Key: fileKey
    };

    res.attachment(fileKey);

    var fileStream = s3
        .getObject(options)
        .createReadStream()
        .on("error", error => {
        console.log(error);
        res.json({ error: "An error has occured, check console." });
        })
        .on("httpData", function(data) {

        file.write(data);
        })
        .on("httpDone", function() {
        file.end();
        });

    fileStream.pipe(res);
    //   fse.writeFileSync("text.csv");
    });

如前所述,文件可以手动下载和保存。但是如何写入文件并自动保存在特定文件夹中呢?

谢谢

【问题讨论】:

  • fs.createWriteStream("/somefolder/test.csv") 有什么问题?
  • 输出数据是:[object Object],原始文件是一个超过70k行的csv。 (98mb)
  • 您的 httpData 处理程序错误。您已经在两个范围内声明了“文件”。
  • 修复了这个问题。可悲的是,它不起作用。它正在创建一个 0KB 的文件。

标签: node.js amazon-web-services amazon-s3


【解决方案1】:

jarmod 的回答代码,已承诺:

const AWS = require('aws-sdk');
const s3 = new AWS.S3({apiVersion: '2006-03-01'});
const params = {Bucket: 'mybucket', Key: 'test.csv'};
const file = require('fs').createWriteStream('/tmp/test.csv');

new Promise((resolve, reject) => {
  const pipe = s3.getObject(params).createReadStream().pipe(file);
  pipe.on('error', reject);
  pipe.on('close', resolve);
});

【讨论】:

    【解决方案2】:

    这是一个将 S3 对象下载到特定本地文件的示例:

    const AWS = require('aws-sdk');
    var s3 = new AWS.S3({apiVersion: '2006-03-01'});
    var params = {Bucket: 'mybucket', Key: 'test.csv'};
    var file = require('fs').createWriteStream('/tmp/test.csv');
    s3.getObject(params).createReadStream().pipe(file);
    

    【讨论】:

    • 我想知道你是如何在异步中做到这一点的?我需要下载 3 个文件并等到它完成才能继续
    • @RicardoE 刚刚看到您的后续问题,抱歉。一种选择可能是承诺每个流的结束,然后等待 Promise.all(...) 参见stackoverflow.com/questions/33599688/…
    猜你喜欢
    • 2021-04-11
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2013-02-02
    • 2022-07-21
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多