Multer is one of the most popular libraries for uploading files to a Node.js server. Multer is a Node.js middleware for handling multipart/form-data
, which is primarily used for uploading files.
Install Multer package in your project
npm i multer
Create a form in your HTML file that will post to your server. Notice the enctype
is set to multipart/form-data
. Also, make sure to give your inputs names. That is how Multer finds them.
<form action="/" method="POST" enctype="multipart/form-data">
<input type="text" name="name">
<input type="file" name="image">
<button type="submit">Submit</button>
</form>
Below is a very basic application of Multer. When our form makes a post request to the root, the Multer middleware (upload.single('image')
) will give us access to the inputs in the request. The middleware takes in the name of the file input from your form. In our case, we called the input image. req.file
holds the file uploaded to the form. req.body
holds the text inputs.
When we defined our upload middleware, we set the destination in which we want to store our file uploads from Multer. In this case, files from our form will be stored in the uploads folder. If the folder doesn’t exist, it will be created automatically.
var express = require('express')
var multer = require('multer')
var upload = multer({ dest: 'uploads/' })
var app = express()
app.post('/', upload.single('image'), function (req, res, next) {
console.log(req.file, req.body);
})
Multer also allows us to customize the way that we handle file uploads.
The disk storage engine gives you full control on storing files to disk. There are two options available, destination
and filename
. They are both functions that determine where the file should be stored.
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './public/uploads');
},
filename: function (req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
}
});
You append this storage property to your upload middleware
const upload = multer({
storage: storage,
});
You can also create a filter function to define which types of files you want to accept and which types of files you don’t. For example, you can set your filter to only accept .png
, .jpeg
., and .jpg
file types.
function checkFileType(file, cb) {
// Allowed ext
const filetypes = /jpeg|jpg|png/;
// Check ext
const extname = filetypes.test(path.extname(file.originalname).toLowerCase());
// Check mime
const mimetype = filetypes.test(file.mimetype);
if (mimetype && extname) {
return cb(null, true);
} else {
cb('Error: Images Only');
}
}
Set this to the fileFilter
property of the upload
object:
const upload = multer({
storage: storage,
fileFilter: function (req, file, cb) {
checkFileType(file, cb);
}
}));