File Uploads with Multer
express.json() multipart/form-data handle NAHI kar sakta — file uploads ke liye multer jaisa middleware chahiye. Multer files ko disk par ya memory mein rakhta hai aur req.file / req.files populate karta hai, text fields req.body mein daal deta hai.
Production mein limits aur fileFilter zaroori hain — bina limit ke koi bhi huge file bhejkar disk bhar sakta hai, aur bina filter ke koi .exe ya script upload kar sakta hai.
const multer = require("multer");
const upload = multer({
dest: "uploads/",
limits: { fileSize: 5 * 1024 * 1024 }, // 5MB
fileFilter: (req, file, cb) => cb(null, file.mimetype.startsWith("image/")),
});
app.post("/avatar", upload.single("avatar"), (req, res) =>
res.json({ file: req.file.filename, name: req.body.name }));- Multipart/form-data ke liye multer chahiye, express.json() kaafi nahi
- req.file/req.files mein files, req.body mein text fields aate hain
- limits + fileFilter + apna generated filename = safe upload
multer.diskStorage() files ko disk par likhta hai (bade files ke liye theek) aur multer.memoryStorage() Buffer mein rakhta hai (chhote files ko seedha S3 ya image processor ko bhejne ke liye theek, lekin memory khaata hai). Naam khud generate karo — client ka filename kabhi use mat karo.
const storage = multer.diskStorage({
destination: (req, file, cb) => cb(null, "uploads/"),
filename: (req, file, cb) =>
cb(null, `${randomUUID()}${path.extname(file.originalname)}`),
});upload.single("avatar") ek file (req.file), upload.array("photos", 5) ek hi field mein kai files (req.files), aur upload.fields([...]) alag-alag field names ke liye use hota hai. Limit exceed hone par multer MulterError throw karta hai jise error middleware mein handle karna chahiye.
app.post("/gallery", upload.array("photos", 5), handler);
app.use((err, req, res, next) => {
if (err instanceof multer.MulterError)
return res.status(400).json({ error: err.code }); // LIMIT_FILE_SIZE
next(err);
});