如何确定S3.getObject()中的数据types

S3的node.js API给出了getObjectcallback中返回的数据的描述。 从http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property :

正文 – (缓冲区,types化数组,Blob,string,ReadableStream)对象数据。

这是真的吗? 有没有办法控制这是什么东西?

我不知道是否可以提前控制数据的types。在getObject()callback中提供的Body字段。 如果你只想确定你是否收到了一个缓冲区,你可以尝试Node的Buffer.isBuffer (data.Body)类的方法。

或者,您可能想完全避免这个问题,并使用Amazon S3文档中的这种方法:

 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.jsasynchronouscallback环境中使用此代码,那么查看代码如下所示可能更有意义:

 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); } 

我找不到任何改变Bodytypes的方法,但是在注意到Body是一个缓冲区之后,我用这个简单而直接的函数将缓冲区转换成了一个ReadableStream: AWS.util.buffer.toStream (或者你也许可以想要使用另一个像stream化器的库 )。

我正在寻找可以在做任何事情之前validation错误的东西,在Amazon的例子中,它转化为“只有在没有错误时才创build写入stream”。

 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); }); });