diegoaguilar
diegoaguilar

Reputation: 8376

Integrating multipart middlware to express application

I need to receive, in a single request, either JSON data and files. So I've been using body-parser which works perfect. However I'm having problems finding a module working nice with express.

This is my router setup:

router.post('/',
  // controllers.requireAuthorization,
  controllers.multipartMiddleware,
  function (req, res) {
    console.log(req.body);
    return res.json({ body: req.body });
  },
  controllers.sitters.validate,
  controllers.sitters.create,
  controllers.sitters.serialize
);

This is what my multipart middleare function looks like, as you can see I'm using multiparty:

function multipartMiddleware(req, res, next) {
  if (req.get('Content-Type').indexOf('multipart/form-data') + 1) {
    new multiparty.Form().parse(req, function (err, fields, files) {
      console.log(JSON.stringify(files));
      req.body = fields;
      return next(err);
    });
  } else {
    console.log(req.get('Content-Type'));
    return next();
  }
}

Of course I've added that premature response return for debug purposes. So I need:

The issues are seeing right now:

enter code here

See how the value of loca is inside a wrapping array.

Upvotes: 2

Views: 464

Answers (1)

peteb
peteb

Reputation: 19428

I would checkout multer, its a popular Express middleware and has a number of different ways to handle files (one or many). It also still allows for fields to be set which will come through on your req.body.

var multer = require('multer');
var upload = multer.dest({ 'temp/' });

// looking for single file, named 'file'
app.put('/file', upload.single('file'), function(req, res) {
  // access the file
  var file = req.file

  // any form fields sent in addition to the file are here
  var body = req.body; 
});

Another popular package thats an alternative to multer is busboy. Its also worth noting that multer is written on top of busboy.

Upvotes: 2

Related Questions