【问题标题】:How to retrieve multiple image from Amazon S3 using imgURL at once?如何使用 imgURL 一次从 Amazon S3 检索多个图像?
【发布时间】:2018-10-17 22:52:21
【问题描述】:

我想根据图像 URL 从 Amazon S3 中一次性检索图像列表。

目前我可以使用以下代码获取单个图像:-

     AWS.config.update({
                    accessKeyId: accessKeyId,
                    secretAccessKey: secretAccessKey
                });

                AWS.config.region = region;

                var bucketInstance = new AWS.S3();
                var params = {
                    Bucket: bucketName,
                    Key: awsImgUrl
                }
                bucketInstance.getObject(params, function (err, file) {
                    if (file) {
                        var dataSrc = "data:" + file.ContentType + ";base64," + EncodeData(file.Body);
                        callbackSuccess(dataSrc);
                    } else {
                        callbackSuccess("Error");
                    }
                });

EncodeData = function (data) {
        var str = data.reduce(function (a, b) { return a + String.fromCharCode(b) }, '');
        return btoa(str).replace(/.{76}(?=.)/g, '$&\n');
    }

在我的场景中,我有多个 S3 图像 URL,例如 awsImgUrl1、awsImgUrl2..awsImgUrln。

如何一次性获取而不是一个接一个?

【问题讨论】:

    标签: angularjs image amazon-s3 aws-sdk-js


    【解决方案1】:

    每次使用 S3 的 api 调用都不能获得超过一个图像。但是,您可以并行进行多个调用。 使用 Promise 很简单。

    var bucketInstance = new AWS.S3();
    var imageKeys = [ awsImgUrl1, awsImgUrl2, awsImgUrl3];
    
    var promisesOfS3Objects = imageKeys.map(function(key) {
      return bucketInstance.getObject({
        Bucket: bucketName,
        Key: key
      }).promise()
        .then(function (file) {
          return "data:" + file.ContentType + ";base64," + EncodeData(file.Body);
        })
      })
    Promise.all(promisesOfS3Objects)
    .then(callbackSuccess) // callbackSuccess is called with an array of string
    .catch(function() { callbackSuccess("Error") })
    

    【讨论】:

      【解决方案2】:

      您可以更改上传图片数据的方式。上传一个包含多个图像数据的文档,而不是上传单个图像。

      const addImageBlock = () => {
        var photoBlock = [
          {
            imageId: 'id',
            type: 'png',
            body: 'data:image/png;base64,iVBORw0K...'
          },
          {
            imageId: 'id2',
            type: 'png',
            body: 'data:image/png;base64,iVBORw0K...'
          },
          {
            imageId: 'id3',
            type: 'png',
            body: 'data:image/png;base64,iVBORw0K...'
          },
          {
            imageId: 'id4',
            type: 'png',
            body: 'data:image/png;base64,iVBORw0K...'
          }
          //...ect
          ];
        s3.upload({
          Key: photoBlockId + '.json',
          Body: photoBlock,
          ACL: 'public-read'
        }, function(err, data) {
          if (err) {
            return alert('There was an error', err.message);
          }
        });
      }
      

      然后,当您通过一个 s3 调用收到此数据时,您可以循环并在前端渲染图像,

      getObject(params, function (err, file) {
         imageArr = [];
          if (file) {
             JSON.parse(file.toString()).map((image) => {
            var image = new Image();
            image.src = image.body;
            imageArr.push(image)
          })
             callbackSuccess(imageArr);
                          } 
          else {
            callbackSuccess("Error");
               }
      });
      

      【讨论】:

        【解决方案3】:

        AWS SDK 没有任何方法可以一次读取多个文件,并且与控制台相同,您不能一次下载多个文件。

        they have only GetObject method do read a object in bucket by key only.
        

        所以在你的情况下,只有当你已经有键名作为列表时,你才必须用它们的键名一一阅读。

        如果您想获取对象列表,则可以获取存储桶中对象的摘要,然后循环下载所有文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-06
          • 2021-07-15
          • 2018-03-14
          • 2015-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多