несколько изображений от base64 до S3 - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я использую следующий код для загрузки строки base64 в AWS S3

buf = new Buffer(req.body.image.replace(/^data:image\/\w+;base64,/, ""),'base64')
var data = {
    Key: String(product._id),
    Body: buf,
    ContentEncoding: 'base64',
    ContentType: 'image/jpeg',
    ACL: 'public-read'
};

s3Bucket.putObject(data, function(err, data){
    if (err) {
        return res.json({
            success: false,
            msg: 'Oops! Something went wrong.' + err
        });
    } else {
        console.log(data);
        var url = "https://s3.eu-central-1.amazonaws.com/bucketname/" + String(product._id);
        product.image = url;
        product.save(function(err) {
            if (err)
                return res.json({
                    success: false,
                    msg: 'Oops! Something went wrong.' + err
                });


            // Return the product
            res.json({
                success: true,
                product: product
            });
        });
    }
});

Это прекрасно работает для загрузки только одного отдельного изображения на платформу AWS S3.Сейчас мы вносим изменения в приложение, что означает, что мы хотим загрузить несколько изображений, поэтому сервер получит массив изображений base64.Как лучше всего загрузить их на платформу AWS S3?Я не смог понять это.

1 Ответ

0 голосов
/ 11 сентября 2018

Я предполагаю, что вы используете AWS javascript SDK, к сожалению, как вы, наверное, знаете, s3 putObject поддерживает загрузку только одного объекта на HTTP-запрос.

Я бы ускорил загрузку изображений, отправив несколько запросов параллельно, используя обещания.

Пример с некоторым непроверенным кодом:

const promises = images.map(img => s3Bucket.putObject({
      Key: img._id,
      Body: new Buffer(img.replace(/^data:image\/\w+;base64,/, ""),'base64'),
      ContentEncoding: 'base64',
      ContentType: 'image/jpeg',
      ACL: 'public-read'}).promise());

Promise.all(promises)
    .then(data => {
        console.log(data); // this should be an array of resolved s3 put object promises now
        // you probably want to update your product model accordingly here, I'm just copying your existing code
        var url = "https://s3.eu-central-1.amazonaws.com/bucketname/" + String(product._id);
        product.images = url;
        product.save(function(err) {
          if (err) {
            return res.json({
              success: false,
              msg: 'Oops! Something went wrong.' + err
            });
          }
          // Return the product
          return res.json({
            success: true,
            product: product
          });
    })
    .catch(error => {
        //handle the error in case one of the promises gets rejected
        return res.json({
            success: false,
            msg: 'Oops! Something went wrong.' + err
        });
    });
});
...