I’m trying to implement an app similar to the O’FISH app. My images are temporarily stored as binary data in MongoDB before being sent to S3 via a Realm trigger function.
I’ve written a realm function that uploads a file to my S3 bucket. This function works fine if the file
is "hello world"
. However, I get Error: Unsupported body payload object
when my file
is a binary image queried from a MongoDB document.
Here is my Realm function:
exports = function(){
var drawings = context.services.get("Cluster0").db("databaseName").collection("drawings");
// get drawing document
const query = { "_id": BSON.ObjectId("61c348229f2368fd6f2a2f95")};
const projection = {
"_id":1,
"thumbnail" : 1,
}
drawings.findOne(query, projection)
.then(doc => {
const imageName = doc._id.toString()
// THE UPLOAD TO S3 WORKS WITH LINE BELOW
// const file = 'hello world'
const file = doc.thumbnail
console.log('file type', Object.prototype.toString.call(file)) // this logs: [object Binary]
// call uploadImageToS3 function
context.functions.execute("uploadImageToS3", imageName, file)
.then (() => {
console.log('Uploaded to S3');
})
};
And here is my uploadImageToS3
function:
exports = async function(imageName, file) {
const AWS = require('aws-sdk');
AWS.config.update({
accessKeyId :context.values.get("AWS_ACCESS_KEY_ID"),
secretAccessKey : context.values.get("AWS_ACCESS_KEY_SECRET"),
region: context.values.get("AWS_REGION")
});
const s3 = new AWS.S3({apiVersion: '2006-03-01'})
const bucketName = context.values.get("AWS_BUCKET")
return s3.upload({
"Bucket": bucketName,
"Key" : imageName,
"Body": file,
"ACL": "public-read",
"ContentType": "image/jpeg",
}).promise()
}
How do I upload a binary image (straight out of a MongoDB document) to S3?
Many thanks in advance!