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