2014-09-12 69 views

回答

12

我不知道你是否可以預先控制數據的類型。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); 
} 
+1

如果上述代碼未能下載,您如何捕獲錯誤? – Mike 2015-04-08 16:19:15

+1

@Mike:在'close'處理程序之前或之後,添加如下內容:file.on('error',function(err){callback(err);}); – Bruce 2015-05-21 16:42:28

+0

謝謝!謝謝!謝謝! – Mike 2015-06-25 17:23:32

3

我找不到任何方式要麼改變身型,但注意到身體是一個緩衝後,我改變了緩衝成ReadableStream用這個方便&漂亮 直接functionAWS.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); 
    }); 
});