代码之家  ›  专栏  ›  技术社区  ›  simple user

如何使用imgURL一次从amazons3检索多个图像?

  •  5
  • simple user  · 技术社区  · 6 年前

    目前我可以使用以下方法获取单个图像code:-

         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。

    3 回复  |  直到 6 年前
        1
  •  1
  •   cementblocks    6 年前

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

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

    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");
             }
    });
    
        2
  •  2
  •   cementblocks    6 年前

    对于S3,每个api调用不能获得多个映像。但是,您可以同时进行多个调用。

    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") })
    
        3
  •  1
  •   kj007 XdebugX    6 年前

    AWS-SDK没有任何方法可以一次读取多个文件,使用console不能一次下载多个文件。

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

    因此,在你的情况下,你必须阅读一个接一个与他们的键名只有当你已经有键名作为列表。。

    如果您想获取对象列表,那么可以获取bucket中的对象摘要,然后放置一个循环来下载所有文件。