2014-09-12 78 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); 
    }); 
});