Search code examples
node.jsexpressmulterbody-parser

Express multer upload doesnt work


I have a problem with my uploader. I think everything with code is right and still the file isnt created in uploads folder. Also when i try to console.log(req.files) i get an empty array. I try to make it locally Here is the code:

const   express = require("express"),
        app = express(),
        multer = require("multer"),
        bodyParser=require("body-parser"),


app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

var storage = multer.diskStorage({
    destination: function (req, file, callback) {
        callback(null, './uploads/');
    },
    filename: function (req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now() + '.' + mime.extension(file.mimetype));
    }
});

var upload = multer({ storage : storage }).array('userPic');

app.post("/postFormAct", isLoggedIn, function(req, res){
    upload(req,res,function(err) {
        console.log(req.files);
    });
});

Also there is my form:

<form method="post" action="/postFormAct" enctype="multipart/form-data">
    <input type="text" name="user"><br>
    <input type="text" name="email"><br>
    <input type="file" name="userPic"><br>
    <input type="submit" value="Submit">
</form>

Solution

  • I think you have an issue with your function level middleware, you have isLoggedIn, you have to chain the multer middleware upload right after like so :

    // ...
    var upload = multer({ storage : storage }).array('userPic');
    
    app.post("/postFormAct", isLoggedIn, upload, function(req, res){
        console.log(req.files)
    });
    

    Here's a full working example :

    const app = require('express')()
    const bodyParser = require('body-parser')
    const multer = require('multer')
    const morgan = require('morgan')
    
    const storage = multer.diskStorage({
        destination: (req, file, cb) => {
            cb(null, 'uploads')
        },
        filename: (req, file, cb) => {
            cb(null, file.fieldname + '-' + Date.now())
        }
    })
    
    const upload = multer({
        storage: storage
    })
    
    app.use(bodyParser.urlencoded({ extended: false }))
    app.use(bodyParser.json())
    app.use(morgan('dev'))
    
    isLoggedIn = (req, res, next) => {
        console.log('check if user is logged in')
        next()
    }
    
    app.post('/uploads', isLoggedIn, upload.array('images'), (req, res) => {
        console.log(req.files);
        return res.send(req.files);
    })
    
    app.listen(8000, () => {
        console.log(`server is listenning on port 8000`)
    })
    

    You can find a test repository here

    Also make sure that your destination dir exist.