使用适用于Node.js的AWS开发工具包将二进制file upload到S3

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

我们已在最新的预览版本中更正了文档,以正确logging此参数。 抱歉关于混音!


我正在试用Node.Js的AWS开发工具包预览版,并且希望使用putObject将压缩的tar包上传到S3。

根据文档 , 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.'); }); }); 

虽然我可以在S3中看到这个文件,但是如果我下载它并尝试解压缩它,我会得到一个文件已损坏的错误。 因此,似乎我的'base64编码数据'的方法是closures的。

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

您不需要将缓冲区转换为base64string。 只要将身体设置为数据,它将工作。

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

 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; } }); }); 

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

 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); } });