Прочитать файл из S3 в буфер - PullRequest
1 голос
/ 16 июня 2020

Я пытаюсь написать функцию в Lambda, которая требует, чтобы файл из S3 был прочитан в буфер. Я видел несколько примеров их считывания в потоки, но ни одного с буферами. Мой текущий код для получения объекта:

exports.handler = async (event, context, callback) => {

    //console.log("Reading options from event:\n", util.inspect(event, {depth: 5}));
    const srcBucket = event.Records[0].s3.bucket.name;
    const srcKey    = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));

    const params = 
        {
            Bucket: srcBucket,
            Key: srcKey
        };

    try 
    {
        var slippiGame = s3.getObject(params, function(error, data) 
        {
            if (error)
            {
                console.log(error);
            }
            else
            {
                const game = new SlippiGame(slippiGame);
            }
        });
    } 
    catch (e) 
    {
        console.log("fail");
        console.log(e);
    }

    console.log(slippiGame);

    return("success");
};

. Я знаю, что этот подход неверен, поскольку моя переменная sloppiGame не является буфером, а конструктор SlippiGame принимает только локальный файл или буфер. Есть ли способ временно сохранить файл из S3 в каталоге Lambda или создать буфер для хранения файла S3?

1 Ответ

2 голосов
/ 16 июня 2020

Атрибут Body для data уже является буфером.

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

const s3 = new AWS.S3({apiVersion: '2006-03-01'});
const params = {Bucket: 'myBucket', Key: 'myImageFile.jpg'};
const file = require('fs').createWriteStream('/path/to/file.jpg');
s3.getObject(params).createReadStream().pipe(file);

Еще одна проблема с вашим текущим кодом: вы смешиваете асинхронный c и варианты обратного вызова обработчика функции Lambda - лучше просто используйте вариант asyn c и избавьтесь от callback

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...