使用AWS SDK for Node.js将二进制文件上载到S3

时间:2012-12-10 18:57:00

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

更新:为了供将来参考,亚马逊现在已经根据询问时的内容更新了文档。根据@Loren Segal的评论如下: -

  

我们已更正最新预览版中的文档,以正确记录此参数。抱歉混淆!


我正在尝试the AWS SDK for Node.Js的开发者预览,并希望使用putObject将压缩的tarball上传到S3。

根据the documentationBody参数应为......

  

正文 - (Base64编码数据)

...因此,我正在尝试以下代码...

var AWS = require('aws-sdk'),
    fs = require('fs');

// For dev purposes only
AWS.config.update({ accessKeyId: 'key', secretAccessKey: 'secret' });

// Read in the file, convert it to base64, store to S3
fs.readFile('myarchive.tgz', function (err, data) {
  if (err) { throw err; }

  var base64data = new Buffer(data, 'binary').toString('base64');

  var s3 = new AWS.S3();
  s3.client.putObject({
    Bucket: 'mybucketname',
    Key: 'myarchive.tgz',
    Body: base64data
  }).done(function (resp) {
    console.log('Successfully uploaded package.');
  });

});

虽然我可以在S3中看到该文件,如果我下载它并尝试解压缩它,我会收到文件已损坏的错误。因此,我的“base64编码数据”方法似乎已关闭。

有人可以帮助我使用putObject上传二进制文件吗?

3 个答案:

答案 0 :(得分:39)

您无需将缓冲区转换为base64字符串。只需将body设置为数据就可以了。

答案 1 :(得分:23)

这是一种使用流发送文件的方法,这可能是大文件所必需的,并且通常会减少内存开销:

var AWS = require('aws-sdk'),
    fs = require('fs');

// For dev purposes only
AWS.config.update({ accessKeyId: 'key', secretAccessKey: 'secret' });

// Read in the file, convert it to base64, store to S3
var fileStream = fs.createReadStream('myarchive.tgz');
fileStream.on('error', function (err) {
  if (err) { throw err; }
});  
fileStream.on('open', function () {
  var s3 = new AWS.S3();
  s3.putObject({
    Bucket: 'mybucketname',
    Key: 'myarchive.tgz',
    Body: fileStream
  }, function (err) {
    if (err) { throw err; }
  });
});

答案 2 :(得分:9)

我能够以这种方式上传我的二进制文件。

var fileStream = fs.createReadStream("F:/directory/fileName.ext");
var putParams = {
    Bucket: s3bucket,
    Key: s3key,
    Body: fileStream
};
s3.putObject(putParams, function(putErr, putData){
    if(putErr){
        console.error(putErr);
    } else {
        console.log(putData);
    }
});