index.js 2.7 KB

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