I'm using multer-s3-transform
to upload file to s3, but before upload I want to resize file, and save in two different size.
Following is my code, no error occur, but file is not uploading.
let multer = require("multer-s3-transform");
const aws = require('aws-sdk');
const sharp = require('sharp');
aws.config.update({
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
accessKeyId: process.env.AWS_ACCESS_KEY_ID
);
const s3 = new aws.S3();
var upload = multer({
storage: multerS3({
s3: s3,
bucket: process.env.AWS_BUCKET_NAME,
shouldTransform: function (req, file, cb) {
console.log("hereeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee");
let originalname = file.originalname;
file.stream.once('data', async function (firstChunk) {
let magic = firstChunk.toString('hex', 0, 4);
let extName = path.extname(originalname).toLowerCase();
// let filename = req.file.fieldname + '-' + Date.now() + path.extname(req.file.originalname);
if (checkMagicNumbers(magic, extName, req)) {
console.log("Valid File***************************");
cb(null, true);
}
});
},
transforms: [{
id: 'original',
key: async function (req, file, cb) {
let basePath = await getDynamicFilePath(req, false);
console.log(basePath, "Path ^^^^^^^^^^^^^^^^^^^^^^^");
let filePath = basePath;
let filename;
if (req.params.container === "resumes") {
void function (req, file, callback) {
filename = Date.now().toString() + '-' + file.originalname;
filePath += "/cropped_" + filename;
}()
} else {
filename = Date.now().toString();
filePath += "/cropped_" + filename;
}
console.log(filePath, "path -------------------");
cb(null, filePath);
},
transform: function (req, file, cb) {
cb(null, sharp().resize(330, 512))
}
}
{
id: 'thumbnail',
key: async function (req, file, cb) {
let basePath = await getDynamicFilePath(req, false);
console.log(basePath, "Path ^^^^^^^^^^^^^^^^^^^^^^^");
let filePath = basePath;
let filename;
if (req.params.container === "resumes") {
void function (req, file, callback) {
filename = Date.now().toString() + '-' + file.originalname;
filePath += "/normal" + filename;
}()
} else {
filename = Date.now().toString();
filePath += "/normal_" + filename;
}
console.log(filePath, "path -------------------");
cb(null, filename);
},
transform: function (req, file, cb) {
cb(null, sharp().resize(1200, 628));
}
}
]
})
}).single("file");
upload(req, res, function (err, filePath) {
console.log(err, "Error");
console.log(filePath, "*************");
});
Everything is working if I use from multer-s3
, except image resizing, but with multer-s3-transform
no error occur, and file is not uploading, and never goes to this lines:
console.log(err, "Error");
console.log(filePath, "*************");
I have found the problem, its in following code block where I want to check file magic number.
file.stream.once('data', async function (firstChunk) {
let magic = firstChunk.toString('hex', 0, 4);
let extName = path.extname(originalname).toLowerCase();
// let filename = req.file.fieldname + '-' + Date.now() + path.extname(req.file.originalname);
if (checkMagicNumbers(magic, extName, req)) {
console.log("Valid File***************************");
cb(null, true);
}
});
If I comment this, every thing is working. It seems when taking magic number of file, file is changed to stream, and upload not work, a way to change stream back to file may work.