Multer File Naming and Destination Setup
Multer allows you to fully control how files are named and where they are stored. This is essential for organizing uploads and avoiding file conflicts.
How to change file name in Multer?
You can change the file name using the filename function in diskStorage.
Example:
const storage = multer.diskStorage({
filename: function (req, file, cb) {
cb(null, Date.now() + "-" + file.originalname);
},
});
This prepends a timestamp to make filenames unique.
How to set custom destination path for uploads?
You can define a custom folder using the destination function:
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, "uploads/");
},
});
Make sure the folder exists before uploading files.
How does Multer generate file names by default?
If you don’t define a custom storage configuration, Multer:
- Assigns a random filename
- Does not preserve the original file name
- Stores files in memory (if no diskStorage is used)
How to avoid file name conflicts in Multer?
To prevent overwriting files with the same name, use unique naming strategies:
Example:
filename: function (req, file, cb) {
const uniqueName = Date.now() + "-" + Math.round(Math.random() * 1e9);
cb(null, uniqueName + "-" + file.originalname);
}
Other approaches:
- Use UUIDs
- Append user IDs
- Hash file names
Can I dynamically set upload destination?
Yes, Multer allows dynamic destination paths based on request data.
Example:
const storage = multer.diskStorage({
destination: function (req, file, cb) {
const folder = req.body.type || "general";
cb(null, `uploads/${folder}/`);
},
filename: function (req, file, cb) {
cb(null, Date.now() + "-" + file.originalname);
},
});
This lets you store files in different folders dynamically.
Complete Example
const express = require("express");
const multer = require("multer");
const app = express();
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, "uploads/");
},
filename: function (req, file, cb) {
const uniqueName = Date.now() + "-" + file.originalname;
cb(null, uniqueName);
},
});
const upload = multer({ storage });
app.post("/upload", upload.single("file"), (req, res) => {
res.json({
message: "File uploaded successfully",
file: req.file,
});
});
app.listen(3000, () => {
console.log("Server running on port 3000");
});
Key Takeaways
- Use
filenameto control file naming - Use
destinationto set upload folder - Always generate unique file names to avoid conflicts
- Dynamic paths allow better file organization