byCoder
byCoder

Reputation: 9184

express.js multiple file upload callback

I'm new to node.js & express.js, so... I want to upload multiple files, and later work with them. But i need to send a response (ok or error status) after all my files have been saved on disk, or if one failed - then send an error callback.

Now I have such code:

var express = require('express');
var router = express.Router();

var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

var fs = require('fs');

router.post('/upload', multipartMiddleware, function(req, res) {
  var reqBody = req.body;
  var reqFiles = req.files;

  saveFile(reqFiles, 'main.xlsx', function(err) {
    if (err) {
      res.status(404).send('');
      return;
    }

    res.send('Multi-File File uploaded');
  }
});

function saveFile(file, name, callback) {
  fs.writeFile('./uploads/' + name, file, callback);
}

but how can i change my code to parse this:

router.post('/upload', multipartMiddleware, function(req, res) {
  var reqBody = req.body;
  var reqFiles = req.files;

  saveFile(reqFiles['files'][0], 'main.xlsx', function(err) {
    if (err) {
      res.status(404).send('');
      return;
    }
  }
  saveFile(reqFiles['files'][1], 'second.xlsx', function(err) {
    if (err) {
      res.status(404).send('');
      return;
    }
  }

  res.send(''); // only after first two fileUploaders have finished
});

function saveFile(file, name, callback) {
  fs.writeFile('./uploads/' + name, file, callback);
}

Upvotes: 2

Views: 1603

Answers (2)

ktilcu
ktilcu

Reputation: 3128

  1. The module recommends not using this. Use the multiparty module directly.
  2. When you have the list of files they will also have file names. you can loop through those and save each file asynchronously. Then respond. Take a peek here

Upvotes: 1

dzm
dzm

Reputation: 23544

You need to iterate through req.files. You can use async library.

For example:

async.each(req.files, function(file, callback) {
  saveFile(file, file.name, callback)
}, function(err) {
  res.send('')
})

Upvotes: 2

Related Questions