S3的node.js API为getObject
的回调中返回的数据提供了以下描述。来自http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property:
Body - (Buffer,Typed Array,Blob,String,ReadableStream)对象数据。
这是真的吗?有没有办法控制它们中的哪一个?
答案 0 :(得分:12)
我不知道你是否可以提前控制getObject()回调中提供的data.Body字段的类型。如果您只想确定是否收到缓冲区,可以尝试使用Node's Buffer.isBuffer(data.Body)类方法。
或者,您可能希望完全避免此问题,并使用亚马逊S3 documentation中的此方法:
var s3 = new AWS.S3();
var params = {Bucket: 'myBucket', Key: 'myImageFile.jpg'};
var file = require('fs').createWriteStream('/path/to/file.jpg');
s3.getObject(params).createReadStream().pipe(file);
假设您将在典型的node.js异步回调环境中使用此代码,那么查看代码可能更有意义:
var fs = require('fs');
function downloadFile(key, localPath, callback) {
var s3 = new AWS.S3();
var params = {Bucket: 'myBucket', Key: key};
var file = fs.createWriteStream(localPath);
file.on('close') {
callback();
}
file.on('error', function(err) {
callback(err);
});
s3.getObject(params).createReadStream().pipe(file);
}
答案 1 :(得分:3)
我无法找到改变Body类型的任何方法,但是在注意到Body是缓冲区后,我将缓冲区转换为ReadableStream,并使用了这个方便的方法。非常简单function:AWS.util.buffer.toStream
(或者您可能想要使用另一个类似streamifier的库)。
我正在寻找可以在做其他任何事情之前验证错误的内容,在亚马逊的例子中,它转换为"只有在没有错误的情况下创建写入流"。
s3.getObject(params, function(err, data) {
if (err) {
console.log(err);
return;
}
var file = require('fs').createWriteStream(name);
var read = AWS.util.buffer.toStream(data.Body);
read.pipe(file);
read.on('data', function(chunk) {
console.log('got %d bytes of data', chunk.length);
});
});