尝试从aws s3下载文件到nodejs writeStream

时间:2016-05-17 11:43:12

标签: node.js amazon-web-services

我正在尝试从s3下载文件,并使用nodejs中的writeStream直接将文件放入文件系统中的文件中。这是我的代码:

var i = parseFloat(response[25]).toFixed(2)
console.log(i)//-6527.34

运行此功能我收到此错误:

downloadFile = function(bucketName, fileName, localFileName) {
    //Donwload the file
    var bucket = new AWS.S3({
        params: { Bucket: bucketName },
        signatureVersion: 'v4'
    });
    var file = require('fs').createWriteStream(localFileName);
    var request = bucket.getObject({ Key: fileName });
    request.createReadStream().pipe(file);
    request.send();
    return request.promise();
}

发生了什么事?写入完成之前文件是否已关闭?为什么呢?

3 个答案:

答案 0 :(得分:7)

var s3 = new AWS.S3({
    accessKeyId: accessKeyId,
    secretAccessKey: secretAccessKey
}),
file = fs.createWriteStream(localFileName);
s3
.getObject({
    Bucket: bucketName,
    Key: fileName
})
.on('error', function (err) {
    console.log(err);
})
.on('httpData', function (chunk) {
    file.write(chunk);
})
.on('httpDone', function () {
    file.end();
})
.send();

答案 1 :(得分:3)

AWS也注意到使用这样的承诺的一个例子:

const s3 = new aws.S3({apiVersion: '2006-03-01'});
const params = { Bucket: 'yourBucket', Key: 'yourKey' };
const file = require('fs').createWriteStream('./local_file_path');

const s3Promise = s3.getObject(params).promise();

s3Promise.then((data) => {
  file.write(data.Body, () => {
    file.end();
    fooCallbackFunction();
  });
}).catch((err) => {
  console.log(err);
});

这对我来说很完美。
https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html

编辑:(2018年2月15日)更新了代码,因为您必须结束写入流(file.end())。

答案 2 :(得分:0)

我已将上述响应与管道中的典型gunzip操作结合起来:

            var s3DestFile = "./archive.gz";
            var s3UnzippedFile    = './deflated.csv';

            var gunzip = zlib.createGunzip();
            var file = fs.createWriteStream( s3DestFile );
            s3.getObject({ Bucket: Bucket, Key: Key })
            .on('error', function (err) {
                console.log(err);
            })
            .on('httpData', function (chunk) {
                file.write(chunk);
            })
            .on('httpDone', function () {
                file.end();

                console.log("downloaded file to" + s3DestFile);
                fs.createReadStream( s3DestFile )
                .on('error', console.error)
                .on('end', () => {
                    console.log("deflated to "+s3UnzippedFile)
                })
                .pipe(gunzip)
                .pipe(fs.createWriteStream( s3UnzippedFile ))
            })
            .send();