aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/multipart.js
blob: 7b994ccc58b83185083300de726c4e285a400854 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* jshint node:true */

'use strict';

var multiparty = require('multiparty'),
    timeout = require('connect-timeout');

function _mime(req) {
  var str = req.headers['content-type'] || '';
  return str.split(';')[0];
}

module.exports = function multipart(options) {
    return function (req, res, next) {
        if (_mime(req) !== 'multipart/form-data') return res.status(400).send('Invalid content-type. Expecting multipart');

        var form = new multiparty.Form({
            uploadDir: '/tmp',
            keepExtensions: true,
            maxFieldsSize: options.maxFieldsSize || (2 * 1024), // only field size, not files
            limit: options.limit || '500mb', // file sizes
            autoFiles: true
        });

        // increase timeout of file uploads by default to 3 mins
        if (req.clearTimeout) req.clearTimeout(); // clear any previous installed timeout middleware

        timeout(options.timeout || (3 * 60 * 1000))(req, res, function () {
            req.fields = { };
            req.files = { };

            form.parse(req, function (err, fields, files) {
                if (err) return res.status(400).send('Error parsing request');
                next(null);
            });

            form.on('file', function (name, file) {
                req.files[name] = file;
            });

            form.on('field', function (name, value) {
                req.fields[name] = value; // otherwise fields.name is an array
            });
        });
    };
};