2016-09-27 96 views
1

我想使用node.js中的Promises从本地系统的s3存储桶下载一些图像文件。使用node.js中的Promise从s3桶下载图像

var params = { 
    Bucket: bucket_name', 
    Key: 'key' 
}; 

var fileStream = fs.createWriteStream('path/to/file.jpg'); 

我想这里面是工作

s3.getObject(params).createReadStream.pipe(fileStream); 

但我希望我的代码看起来象

return s3.getObject(params).promise() 
    .then(function(data) { 
     //console.log(data.Body); 
     // No idea about this section 
    }) 
    .catch(function(err) { 
     throw err; 
    }); 

我不得不使用承诺,以确保所有的图像应该下载。

+0

您可以使用任何承诺库将s3代码包装到诺言中(如蓝鸟)。我不认为你可以使用流媒体,但 –

+0

,但我必须流它创建一个文件与 –

+0

你可以将它保存到文件没有流,因为S3可以返回一个字节数组,你将保存到文件 –

回答

1

一个可能的解决方案是使用bluebird并创建一个返回的流的末尾承诺的功能:

const B = require('bluebird'); 

function downloadFromS3 (object) { 
    var p = B.Promise.defer(); 

    var stream = s3.getObject(params).createReadStream() 

    stream.pipe(fileStream); 

    stream.on('error', (e) => p.reject(e)) 

    stream.on('end',() => p.resolve()) 

    return p.promise; 
} 

downloadFromS3(params) 
    .then(() => console.log('finished')) 
    .catch(() => console.log('failed')) 

不知道如果这个代码具体的工作,但它可以给你一个方向调查。

0
streamToPromise = require('stream-to-promise'); 

var fileStream = fs.createWriteStream('path/to/file.jpg'); 
streamToPromise(fileStream).then(function() { 
    console.log('Image saved to file.'); 
}); 
s3.getObject(params).createReadStream.pipe(fileStream); 
+0

介意详细说明您的代码? –

0

这是一个本地承诺解决方案,在读取流和写入流上都具有错误检测功能。

function streamPromise(stream) { 
    return new Promise((resolve, reject) => { 
     stream.on('end',() => { 
      resolve('end'); 
     }); 
     stream.on('finish',() => { 
      resolve('finish'); 
     }); 
     stream.on('error', (error) => { 
      reject(error); 
     }); 
    }); 
} 

async function s3Download(srcBucket, srcKey, outputPath) { 
    var objReq = s3.getObject({ 
     Bucket: srcBucket, 
     Key: srcKey 
    }); 
    let outStream = fs.createWriteStream(outputPath); 
    let readStream = objReq.createReadStream(); 
    readStream.on('error', (err) => { 
     console.warn('s3download error', err); 
     outStream.emit("error", err); 
    }); 
    readStream.pipe(outStream); 
    return streamPromise(outStream); 
}