Загрузка файла изображения на AWS Lambda с помощью AWS API-шлюза - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь создать лямбда-функцию, которая принимает изображение как multipart / form-data, выполняет некоторую обработку изображения и загружает его в s3, а также возвращает ответ клиенту.Но я застрял в самой первой части загрузки изображения в AWS Lambda с использованием API-шлюза.Я пытался сделать это в NodeJS, как показано ниже:

exports.handler = async (event, context, callback) => {
  var buf = Buffer.from(event.body.replace(/^data:image\/\w+;base64,/, ""),"base64");

  var data = {
    Bucket: "bucket-name", 
    Key: "abc.jpg", 
    Body: buf,
    ContentType: 'image/jpg',
    ACL: 'public-read'
  };
  data = await s3.upload(data).promise();
  return {
         statusCode: 200,
         body: JSON.stringify(buf),
     };

Я получаю следующий ответ в Postman, отправив запрос POST к API:

{
    "ETag": "\"b0e5b18d38904f109e0aef0b29e132be\"",
    "Location": "https://bucket-name.s3.us-east-2.amazonaws.com/abc.jpg",
    "key": "abc.jpg",
    "Key": "abc.jpg",
    "Bucket": "bucket-name"
}

Но когда я пытаюсьпросмотрите загруженное изображение в моем браузере, используя общедоступный URL-адрес в ответе, приведенном в ответе выше, я получаю пустое изображение.

Может кто-нибудь указать мне здесь ошибку или предложить какой-то более эффективный подход.Спасибо.

1 Ответ

0 голосов
/ 06 января 2019

Как предлагает Ашан, вы можете использовать лучшие практики загрузки изображений через браузер.

Если размер изображения не такой большой, здесь - рабочий пример загрузки изображения на S3через интеграцию ApiGateway / Lambda Proxy.

Лямбда-код функции -

exports.handler = (event, context, callback) => {
  let encodedImage = JSON.parse(event.body).user_avatar;
  let decodedImage = Buffer.from(encodedImage, 'base64');
  var filePath = "avatars/" + event.queryStringParameters.username + ".png"

  var params = {
    "Body": decodedImage,
    "Bucket": "bucketName",
    "Key": filePath,
    "ContentType " : "mime/png"
  };
  s3.upload(params, function (err, data) {
    if (err) {
      callback(err, null);
    } else {
      let response = {
        "statusCode": 200,
        "body": JSON.stringify(data),
        "isBase64Encoded": false
      };
      callback(null, response);
    }
  });
};

Serverless.yml

service: aws-api-lambda-s3-image-upload

frameworkVersion: ">=1.1.0 <2.0.0"

provider:
  name: aws
  runtime: nodejs8.10
  iamRoleStatements:
    -  Effect: "Allow"
       Action:
         - "s3:ListBucket"
       Resource: "arn:aws:s3:::bucketName"
    -  Effect: "Allow"
       Action:
         - "s3:PutObject"
       Resource: "arn:aws:s3:::bucketName/*"

functions:
  index:
    handler: handler.handler
    events:
      - http: POST handler

Json Полезная нагрузка должна быть -

{
  "user_avatar" : "<<base64 encoded image>>"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...