NodeJS Multer is not working

I tried to file upload with NodeJS + ExpressJS + Multer but does not work well.

My ExpressJS Version is 4.12.3

this is my source


var express = require('express'),
    multer  = require('multer');

var app = express();
app.use(express.static(__dirname + '/public'));
app.use(multer({ dest: './uploads/'}));'/', function(req, res){
    console.log(req.body); // form fields
    console.log(req.files); // form files
app.get('/', function(req, res)  {

app.listen(5000, function() {
    console.log("start 5000");


<!DOCTYPE html>
<head lang="en">
    <meta charset="UTF-8">
    <form method="post" enctype="multipart/form-data">
        <input id="file" type="file"/>
        <button type="submit">test</button>

My NodeJS Console Log when I click Submit Button:

"C:\Program Files\nodejs\node.exe" server.js
start 5000

on NodeJS Console, there is empty object at req.files Is some problem on my source?



I don't see you calling any API to upload file on click of submit button. Let me give you more comprehensive implementation.

multer config in app.js

    dest: './uploads/',
    rename: function (fieldname, filename) {
        return filename.replace(/\W+/g, '-').toLowerCase() +
    onFileUploadStart: function (file) {
        console.log(file.fieldname + ' is starting ...')
    onFileUploadData: function (file, data) {
        console.log(data.length + ' of ' + file.fieldname + ' arrived')
    onFileUploadComplete: function (file) {
        console.log(file.fieldname + ' uploaded to  ' + file.path)


<form id="uploadProfilePicForm" enctype="multipart/form-data" action="/user/profile_pic_upload" method="post">
          <input type="file" multiple="multiple" id="userPhotoInput" name="userPhoto"  accept="image/*" />
          <input type="submit" name="submit" value="Upload">

End point '/user/profile_pic_upload' POST calls uploadProfilePic in controller

var control = require('../controllers/controller');'/user/profile_pic_upload',control.uploadProfilePic);

Upload profile pic logic in users controller

uploadProfilePic = function(req,res){
    // get the temporary location of the file
    var tmp_path = req.files.userPhoto.path;
    // set where the file should actually exists 
    var target_path = '/Users/narendra/Documents/Workspaces/NodeExpressWorkspace/MongoExpressUploads/profile_pic/' +;
    // move the file from the temporary location to the intended location
    fs.rename(tmp_path, target_path, function(err) {
        if (err) throw err;
        // delete the temporary file, so that the explicitly set temporary upload dir does not get filled with unwanted files
        fs.unlink(tmp_path, function() {
            if (err) {
                throw err;
                    var profile_pic =;
                    //use profile_pic to do other stuffs like update DB or write rendering logic here.

Use this example, it uses firebase cloud function and firebase storage to upload file but you can use it for anything , it uses express-multipart-file-parser and works like charm the above link just works perfectly,I tested this code and pushed it to repo for you guys.Just add your configuration and there you go.


Try this

var multer = require('multer')

var storage = multer.diskStorage({
    destination: function (request, file, callback) {
        callback(null, './uploads/');
    filename: function (request, file, callback) {
        callback(null, file.originalname)

var upload = multer({ storage: storage });'/', upload.single('photo'), function (req, res) {

    console.log(req.body) // form fields
    console.log(req.file) // form files



Recent Questions

Top Questions

Home Tags Terms of Service Privacy Policy DMCA Contact Us

©2020 All rights reserved.