Uploading images using Node.js, Express, and Mongoose Uploading images using Node.js, Express, and Mongoose mongoose mongoose

Uploading images using Node.js, Express, and Mongoose


I'll answer my own question for the first time. I found an example straight from the source. Please forgive the poor indentation. I wasn't sure how to indent properly when copying and pasting. The code comes straight from Express multipart/form-data example on GitHub.

// Expose modules in ./support for demo purposesrequire.paths.unshift(__dirname + '/../../support');/** * Module dependencies. */var express = require('../../lib/express')  , form = require('connect-form');var app = express.createServer(  // connect-form (http://github.com/visionmedia/connect-form)  // middleware uses the formidable middleware to parse urlencoded  // and multipart form data  form({ keepExtensions: true }));app.get('/', function(req, res){  res.send('<form method="post" enctype="multipart/form-data">'    + '<p>Image: <input type="file" name="image" /></p>'    + '<p><input type="submit" value="Upload" /></p>'    + '</form>');});app.post('/', function(req, res, next){  // connect-form adds the req.form object  // we can (optionally) define onComplete, passing  // the exception (if any) fields parsed, and files parsed  req.form.complete(function(err, fields, files){    if (err) {      next(err);    } else {      console.log('\nuploaded %s to %s'        ,  files.image.filename        , files.image.path);      res.redirect('back');    }  });  // We can add listeners for several form  // events such as "progress"  req.form.on('progress', function(bytesReceived, bytesExpected){    var percent = (bytesReceived / bytesExpected * 100) | 0;    process.stdout.write('Uploading: %' + percent + '\r');  });});app.listen(3000);console.log('Express app started on port 3000');


Since you're using express, just add bodyParser:

app.use(express.bodyParser());

then your route automatically has access to the uploaded file(s) in req.files:

app.post('/todo/create', function (req, res) {    // TODO: move and rename the file using req.files.path & .name)    res.send(console.dir(req.files));  // DEBUG: display available fields});

If you name the input control "todo" like this (in Jade):

form(action="/todo/create", method="POST", enctype="multipart/form-data")    input(type='file', name='todo')    button(type='submit') New

Then the uploaded file is ready by the time you get the path and original filename in 'files.todo':

  • req.files.todo.path, and
  • req.files.todo.name

other useful req.files properties:

  • size (in bytes)
  • type (e.g., 'image/png')
  • lastModifiedate
  • _writeStream.encoding (e.g, 'binary')


You can configure the connect body parser middleware in a configuration block in your main application file:

    /** Form Handling */    app.use(express.bodyParser({        uploadDir: '/tmp/uploads',        keepExtensions: true    }))    app.use(express.limit('5mb'));