Загрузка и чтение изображения с s3 через почтальона и лямбду - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь написать код, куда я отправляю изображение или массив изображений с помощью multipart / form-data, как показано на изображениях ниже:

Нажмите здесь, чтобы посмотреть скриншот почтальона

Я пытаюсь сохранить эти изображения в корзину S3, а затем вызвать другую лямбду для чтения изображений для выполнения извлечения текста с помощью AWS rekognition.

Код для лямбды, в которой хранится изображения как показано ниже:

var AWS = require('aws-sdk')
var express = require('express')
var multer = require('multer')
var multerS3 = require('multer-s3')
var bodyParser = require('body-parser')
const cors = require('cors')

var app = express()
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors())

const env = process.env.NODE_ENV || 'prod'

AWS.config.update({
    accessKeyId: 'ACCESS_KEY',
    secretAccessKey: 'SECRET_KEY',
    region: 'ap-south-1'
});

var s3 = new AWS.S3({
    region: "ap-south-1"
})

var lambda = new AWS.Lambda({
    region: "ap-south-1"
});

var upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: 'MY_BUCKET_NAME',
        metadata: function (req, file, cb) {
            cb(null, { fieldName: file.fieldname });
        },
        key: function (req, file, cb) {
            req.originalname = file.originalname
            cb(null, req.originalname)
        }
    })
})

app.post('/', upload.array('file', 2), function (req, res, next) {

    const params = {
        FunctionName: "ANOTHER_LAMBDA_NAME",
        Payload: JSON.stringify({ "fileName": req.originalname })
    };

    return lambda.invoke(params, (err, data) => {
        if (err) console.log("err", err.stack);
        else {
            res.json(data.Payload)
        }
    });
})

if (env === "dev") {
    const port = process.env.port || 4000
    app.listen(port, () => console.log(`server is running on ${port}`))
}
else {
    module.exports = app
}

Код для другой лямбды выглядит следующим образом:

var AWS = require('aws-sdk')
var s3 = new AWS.S3()

const rekognition = new AWS.Rekognition()

exports.handler = function(event, context) {
  var params = {
    Image: { 
      S3Object: {
        Bucket: 'MY_BUCKET_NAME',
        Name: event.filename,
      }
    }
  };

  rekognition.detectText(params, function(err, data) {
    if (err) console.log(err, err.stack); 
    else     context.succeed(data);           // returns "null"
  });
};

После этого я создал шлюз API, который запускает первую лямбду для загрузки файлов в s3 как на картинке выше. Я получаю ответ: "null"

Основная проблема заключается в том, что изображение сохраняется в S3 Bucket. Но когда я загружаю это изображение и пытаюсь открыть его, оно выдает следующую ошибку: The file “EPICared.jpg” could not be opened. It may be damaged or use a file format that Preview doesn’t recognize.

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

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