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

isN*_*247 47 javascript amazon-s3 amazon-web-services node.js

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

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


我正在尝试使用适用于Node.Js的AWS开发工具包的开发者预览版,并希望使用压缩包将tarball上传到S3 putObject.

根据文档,Body参数应该是......

正文 - (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.');
  });

});
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*dyD 41

您不需要将缓冲区转换为base64字符串.只需将body设置为数据即可.

  • 我们已更正最新预览版中的文档,以正确记录此参数.抱歉混淆! (9认同)
  • 是否可以传递一个Stream而不是数据?例如,我想发送一个50MB的文件.我可以在内部将可读流和S3.client管道传递给S3吗? (3认同)

Cap*_*ion 24

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

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; }
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 当您说“上传的文件不等于来源”时,我不确定您的意思。我使用类似的代码将二进制 MP4 文件上传到 AWS。听起来好像您正在尝试在浏览器而不是 NodeJS 中运行此代码?你可以说得更详细点吗? (2认同)

sha*_*aun 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);
    }
});
Run Code Online (Sandbox Code Playgroud)