首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nodejs循环下载s3图像(getObject)

Nodejs循环下载s3图像(getObject)
EN

Stack Overflow用户
提问于 2018-04-13 04:37:27
回答 2查看 2.7K关注 0票数 1

我正试图在循环中从S3桶下载图像。我的桶不是公共的,使用直接getSignedURL也不起作用(禁止错误)。在用户选择用户界面时,我需要从S3下载(10-30)图像(然后在创建GIF之后删除)。

它下载正确数量的图像(具有正确的名称),但所有图像的内容被替换为本地机器上的最后一个图像。我甚至写了一个在循环中调用的承诺(希望每个getObject调用在下一个调用之前先完成),但是没有工作。除了蓝知更鸟,我尝试了this的所有解决方案,但结果是一样的。我的代码如下所示:

代码语言:javascript
复制
var urlParams = {Bucket: 'bucket_name', Key: ''};
  for (i = 0; i < imageNames.length; i+=increment) {
    urlParams.Key = imageNames[i]+'.jpg';
    pathToSave = '/local-files/'+urlParams.Key;

    var tempFile = fs.createWriteStream(pathToSave);
    // I tried a Promise (and setTimeout) here too but gives me the same result
    var stream = s3.getObject(urlParams).createReadStream().pipe(tempFile);
    var had_error = false;
    stream.on('error', function(err){
      had_error = true;
    });
    stream.on('close', function(){
      if (!had_error) {
        console.log("Image saved");        
      } 
    });    
  }

在上面的代码完成之后,正如我所提到的,所有具有正确名称的图像都会被保存,但是由于这里的非阻塞问题,所有图像都包含数组中最后一个图像的内容(imageNames)。我写的和尝试过的承诺如下

代码语言:javascript
复制
function getBucketObject(urlParams){
    return  new Promise ((resolve, reject)=> { 
      var pathToSave = '/local-files/'+params.Key;
      var tempFile = fs.createWriteStream(pathToSave);
      var stream = s3.getObject(params).createReadStream().pipe(tempFile);
      var had_error = false;
      stream.on('error', function(err){
        had_error = true;
      });
      stream.on('close', function(){
        if (!had_error) {
          resolve(pathToSave);
        } 
      });
    })
}

setTimeout和Promise都不能解决我的问题。任何帮助都将不胜感激。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-14 05:21:30

您应该使用let而不是var

将代码修改为:

代码语言:javascript
复制
for (var i = 0; i < imageNames.length; i+=increment) {
    let urlParams = {Bucket: 'bucket_name', Key: imageNames[i]+'.jpg'};
    let pathToSave = 'img/analysis/'+urlParams.Key;
    getBucketObject(urlParams).then(function(pathToSave){
      console.log("image saved");
    })
}

function getBucketObject(urlParams){
    return  new Promise ((resolve, reject)=> { 
      let pathToSave = '/local-files/'+params.Key;
      let tempFile = fs.createWriteStream(pathToSave);
      let stream = s3.getObject(params).createReadStream().pipe(tempFile);
      let had_error = false;
      stream.on('error', function(err){
        had_error = true;
      });
      stream.on('close', function(){
        if (!had_error) {
          resolve(pathToSave);
        } 
      });
    })
}
票数 1
EN

Stack Overflow用户

发布于 2018-04-14 02:17:04

按照@Anshuman在评论中的建议,我尝试了使用let而不是var的代码,现在它可以工作了。谢谢安舒曼。循环中的代码如下所示

代码语言:javascript
复制
for (var i = 0; i < imageNames.length; i+=increment) {
    let urlParams = {Bucket: 'bucket_name', Key: imageNames[i]+'.jpg'};
    let pathToSave = '/local-files/'+urlParams.Key;
    getBucketObject(urlParams).then(function(pathToSave){
      console.log("image saved");
    })
  }

允诺函数在下面

代码语言:javascript
复制
function getBucketObject(urlParams){
    return  new Promise ((resolve, reject)=> { 
      let pathToSave = '/local-files/'+params.Key;
      let tempFile = fs.createWriteStream(pathToSave);
      let stream = s3.getObject(params).createReadStream().pipe(tempFile);
      let had_error = false;
      stream.on('error', function(err){
        had_error = true;
      });
      stream.on('close', function(){
        if (!had_error) {
          resolve(pathToSave);
        } 
      });
    })
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49809382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档