Как получить несколько изображений из Amazon S3, используя imgURL одновременно? - PullRequest
0 голосов
/ 06 октября 2018

Я хочу получить список изображений за один раз из Amazon S3 на основе URL-адреса изображения.

В настоящее время я могу получить одно изображение, используя следующий код: -

     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, например, awsImgUrl1, awsImgUrl2..awsImgUrln.

Как получить его за один раз вместо одного за другим?

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Вы не можете получить более одного изображения за вызов API с помощью S3.Однако вы можете сделать несколько звонков параллельно.Используя обещания это просто.

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") })
0 голосов
/ 17 октября 2018

Вы можете изменить способ загрузки данных изображения.Вместо загрузки одного изображения загрузите один документ, содержащий несколько данных изображения.

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");
         }
});
0 голосов
/ 10 октября 2018

В AWS SDK нет метода для чтения нескольких файлов как один и тот же с консоли, вы не можете загружать несколько файлов одновременно.

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

, поэтому в вашем случае вы должны читать по одномус их именами ключей, только если у вас уже есть имена ключей в виде списка.

вы можете получить сводку объектов в корзине, если вы хотите получить список объектов, а затем запустить цикл для загрузки всех файлов.

...