UNPKG

2.59 kBJavaScriptView Raw
1var makeMiddleware = require('./lib/make-middleware')
2
3var diskStorage = require('./storage/disk')
4var memoryStorage = require('./storage/memory')
5var MulterError = require('./lib/multer-error')
6
7function allowAll (req, file, cb) {
8 cb(null, true)
9}
10
11function Multer (options) {
12 if (options.storage) {
13 this.storage = options.storage
14 } else if (options.dest) {
15 this.storage = diskStorage({ destination: options.dest })
16 } else {
17 this.storage = memoryStorage()
18 }
19
20 this.limits = options.limits
21 this.preservePath = options.preservePath
22 this.fileFilter = options.fileFilter || allowAll
23}
24
25Multer.prototype._makeMiddleware = function (fields, fileStrategy) {
26 function setup () {
27 var fileFilter = this.fileFilter
28 var filesLeft = Object.create(null)
29
30 fields.forEach(function (field) {
31 if (typeof field.maxCount === 'number') {
32 filesLeft[field.name] = field.maxCount
33 } else {
34 filesLeft[field.name] = Infinity
35 }
36 })
37
38 function wrappedFileFilter (req, file, cb) {
39 if ((filesLeft[file.fieldname] || 0) <= 0) {
40 return cb(new MulterError('LIMIT_UNEXPECTED_FILE', file.fieldname))
41 }
42
43 filesLeft[file.fieldname] -= 1
44 fileFilter(req, file, cb)
45 }
46
47 return {
48 limits: this.limits,
49 preservePath: this.preservePath,
50 storage: this.storage,
51 fileFilter: wrappedFileFilter,
52 fileStrategy: fileStrategy
53 }
54 }
55
56 return makeMiddleware(setup.bind(this))
57}
58
59Multer.prototype.single = function (name) {
60 return this._makeMiddleware([{ name: name, maxCount: 1 }], 'VALUE')
61}
62
63Multer.prototype.array = function (name, maxCount) {
64 return this._makeMiddleware([{ name: name, maxCount: maxCount }], 'ARRAY')
65}
66
67Multer.prototype.fields = function (fields) {
68 return this._makeMiddleware(fields, 'OBJECT')
69}
70
71Multer.prototype.none = function () {
72 return this._makeMiddleware([], 'NONE')
73}
74
75Multer.prototype.any = function () {
76 function setup () {
77 return {
78 limits: this.limits,
79 preservePath: this.preservePath,
80 storage: this.storage,
81 fileFilter: this.fileFilter,
82 fileStrategy: 'ARRAY'
83 }
84 }
85
86 return makeMiddleware(setup.bind(this))
87}
88
89function multer (options) {
90 if (options === undefined) {
91 return new Multer({})
92 }
93
94 if (typeof options === 'object' && options !== null) {
95 return new Multer(options)
96 }
97
98 throw new TypeError('Expected object for argument options')
99}
100
101module.exports = multer
102module.exports.diskStorage = diskStorage
103module.exports.memoryStorage = memoryStorage
104module.exports.MulterError = MulterError