S3的node.js API对getObject
回调中返回的数据给出了以下描述。从http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property:如何确定S3.getObject()中的数据类型
Body - (Buffer,Typed Array,Blob,String,ReadableStream)对象数据。
这是真的吗?有没有办法控制它是哪些东西?
S3的node.js API对getObject
回调中返回的数据给出了以下描述。从http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property:如何确定S3.getObject()中的数据类型
Body - (Buffer,Typed Array,Blob,String,ReadableStream)对象数据。
这是真的吗?有没有办法控制它是哪些东西?
我不知道你是否可以预先控制数据的类型。getObject()回调中提供的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);
}
我找不到任何方式要么改变身型,但注意到身体是一个缓冲后,我改变了缓冲成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);
});
});
如果上述代码未能下载,您如何捕获错误? – Mike 2015-04-08 16:19:15
@Mike:在'close'处理程序之前或之后,添加如下内容:file.on('error',function(err){callback(err);}); – Bruce 2015-05-21 16:42:28
谢谢!谢谢!谢谢! – Mike 2015-06-25 17:23:32