Я пытаюсь написать код, куда я отправляю изображение или массив изображений с помощью 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.
Так что вы, ребята, предлагаете мне сделать? Куда я иду не так? Я не могу понять, почему изображение не может быть открыто или прочитано другой лямбдой.