costco-grocery-list/backend/middleware/image.js

49 lines
1.2 KiB
JavaScript

const multer = require("multer");
const sharp = require("sharp");
// Configure multer for memory storage (we'll process before saving to DB)
const upload = multer({
storage: multer.memoryStorage(),
limits: {
fileSize: 20 * 1024 * 1024, // 20MB max file size
},
fileFilter: (req, file, cb) => {
// Only accept images
if (file.mimetype.startsWith("image/")) {
cb(null, true);
} else {
cb(new Error("Only image files are allowed"), false);
}
},
});
// Middleware to process and compress images
const processImage = async (req, res, next) => {
if (!req.file) {
return next();
}
try {
// Compress and resize image to 800x800px, JPEG quality 85
const processedBuffer = await sharp(req.file.buffer)
.resize(800, 800, {
fit: "inside",
withoutEnlargement: true,
})
.jpeg({ quality: 85 })
.toBuffer();
// Attach processed image to request
req.processedImage = {
buffer: processedBuffer,
mimeType: "image/jpeg",
};
next();
} catch (error) {
res.status(400).json({ message: "Error processing image: " + error.message });
}
};
module.exports = { upload, processImage };