2

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);
}

2 Answers 2

2

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('')
})
Sign up to request clarification or add additional context in comments.

5 Comments

where should i respond with ok status?
In the callback for the async function. Where i have res.send('')
Basically what it's doing is there's the initial callback with (file, callback) this is called for each file. Once all files are processed, your final callback with res.send('') will be called, you can handle your errors in the final callback as well.
var express = require('express'); var router = express.Router(); var multiparty = require('multiparty'); var fs = require('fs'); var async = require("async");
router.post('/upload', function(req, res) { var form = new multiparty.Form(); form.parse(req, function(err, fields, files) { async.each(files, function(file, callback) { saveFile(file[0], file[0].originalFilename, function(err) { if (err) { res.status(404).send('File not uploaded'); return; } }); }, function(err) { res.send(''); }) }); }); function saveFile(file, name, callback) { fs.writeFile('./' + name, file, callback); } should be like this?
1
  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

4 Comments

Exactly. The module says don't use this module.
router.post('/upload', function(req, res) { var form = new multiparty.Form(); form.parse(req, function(err, fields, files) { async.each(files, function(file, callback) { saveFile(file[0], file[0].originalFilename, function(err) { if (err) { res.status(404).send('File not uploaded'); return; } }); }, function(err) { res.send(''); }) }); }); function saveFile(file, name, callback) { fs.writeFile('./' + name, file, callback); } should be like this?
var express = require('express'); var router = express.Router(); var multiparty = require('multiparty'); var fs = require('fs'); var async = require("async");
You would need to build the middleware yourself but multiparty is pretty straightforward.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.