+3
-0
@@ -22,2 +22,3 @@ var makeMiddleware = require('./lib/make-middleware') | ||
| this.preservePath = options.preservePath | ||
| this.defParamCharset = options.defParamCharset || 'latin1' | ||
| this.fileFilter = options.fileFilter || allowAll | ||
@@ -51,2 +52,3 @@ } | ||
| preservePath: this.preservePath, | ||
| defParamCharset: this.defParamCharset, | ||
| storage: this.storage, | ||
@@ -82,2 +84,3 @@ fileFilter: wrappedFileFilter, | ||
| preservePath: this.preservePath, | ||
| defParamCharset: this.defParamCharset, | ||
| storage: this.storage, | ||
@@ -84,0 +87,0 @@ fileFilter: this.fileFilter, |
@@ -1,3 +0,1 @@ | ||
| var objectAssign = require('object-assign') | ||
| function arrayRemove (arr, item) { | ||
@@ -64,5 +62,5 @@ var idx = arr.indexOf(item) | ||
| delete placeholder.fieldname | ||
| objectAssign(placeholder, file) | ||
| Object.assign(placeholder, file) | ||
| } | ||
| module.exports = FileAppender |
+47
-19
| var is = require('type-is') | ||
| var Busboy = require('busboy') | ||
| var extend = require('xtend') | ||
| var appendField = require('append-field') | ||
@@ -28,18 +27,8 @@ | ||
| var preservePath = options.preservePath | ||
| var defParamCharset = options.defParamCharset | ||
| req.body = Object.create(null) | ||
| req.on('error', function (err) { | ||
| abortWithError(err) | ||
| }) | ||
| var busboy | ||
| try { | ||
| busboy = Busboy({ headers: req.headers, limits: limits, preservePath: preservePath }) | ||
| } catch (err) { | ||
| return next(err) | ||
| } | ||
| var appender = new FileAppender(fileStrategy, req) | ||
| var appender = null | ||
| var isDone = false | ||
@@ -54,8 +43,10 @@ var readFinished = false | ||
| isDone = true | ||
| req.unpipe(busboy) | ||
| if (busboy) { | ||
| req.unpipe(busboy) | ||
| setImmediate(() => { | ||
| busboy.removeAllListeners() | ||
| }) | ||
| } | ||
| drainStream(req) | ||
| req.resume() | ||
| setImmediate(() => { | ||
| busboy.removeAllListeners() | ||
| }) | ||
| next(err) | ||
@@ -90,2 +81,34 @@ } | ||
| function handleRequestFailure (err) { | ||
| if (isDone) return | ||
| if (busboy) busboy.destroy(err) | ||
| abortWithError(err) | ||
| } | ||
| req.on('error', function (err) { | ||
| handleRequestFailure(err || new Error('Request error')) | ||
| }) | ||
| req.on('aborted', function () { | ||
| handleRequestFailure(new Error('Request aborted')) | ||
| }) | ||
| req.on('close', function () { | ||
| if (req.readableEnded) return | ||
| handleRequestFailure(new Error('Request closed')) | ||
| }) | ||
| try { | ||
| busboy = Busboy({ | ||
| headers: req.headers, | ||
| limits: limits, | ||
| preservePath: preservePath, | ||
| defParamCharset: defParamCharset | ||
| }) | ||
| } catch (err) { | ||
| return next(err) | ||
| } | ||
| appender = new FileAppender(fileStrategy, req) | ||
| // handle text field data | ||
@@ -136,2 +159,7 @@ busboy.on('field', function (fieldname, value, { nameTruncated, valueTruncated }) { | ||
| fileFilter(req, file, function (err, includeFile) { | ||
| if (errorOccured) { | ||
| appender.removePlaceholder(placeholder) | ||
| return fileStream.resume() | ||
| } | ||
| if (err) { | ||
@@ -165,3 +193,3 @@ appender.removePlaceholder(placeholder) | ||
| appender.removePlaceholder(placeholder) | ||
| uploadedFiles.push(extend(file, info)) | ||
| uploadedFiles.push({ ...file, ...info }) | ||
| return pendingWrites.decrement() | ||
@@ -176,3 +204,3 @@ } | ||
| var fileInfo = extend(file, info) | ||
| var fileInfo = { ...file, ...info } | ||
@@ -179,0 +207,0 @@ appender.replacePlaceholder(placeholder, fileInfo) |
+6
-5
| { | ||
| "name": "multer", | ||
| "description": "Middleware for handling `multipart/form-data`.", | ||
| "version": "2.0.2", | ||
| "version": "2.1.0", | ||
| "contributors": [ | ||
@@ -12,2 +12,6 @@ "Hage Yaapa <captain@hacksparrow.com> (http://www.hacksparrow.com)", | ||
| "repository": "expressjs/multer", | ||
| "funding": { | ||
| "type": "opencollective", | ||
| "url": "https://opencollective.com/express" | ||
| }, | ||
| "keywords": [ | ||
@@ -26,6 +30,3 @@ "form", | ||
| "concat-stream": "^2.0.0", | ||
| "mkdirp": "^0.5.6", | ||
| "object-assign": "^4.1.1", | ||
| "type-is": "^1.6.18", | ||
| "xtend": "^4.0.2" | ||
| "type-is": "^1.6.18" | ||
| }, | ||
@@ -32,0 +33,0 @@ "devDependencies": { |
+4
-1
@@ -23,3 +23,5 @@ # Multer [![NPM Version][npm-version-image]][npm-url] [![NPM Downloads][npm-downloads-image]][npm-url] [![Build Status][ci-image]][ci-url] [![Test Coverage][test-image]][test-url] [![OpenSSF Scorecard Badge][ossf-scorecard-badge]][ossf-scorecard-visualizer] | ||
| | [Việt Nam](https://github.com/expressjs/multer/blob/main/doc/README-vi.md) | Vietnamese | | ||
| | [Türkçe](https://github.com/expressjs/multer/blob/main/doc/README-tr.md) | Turkish | | ||
| ## Installation | ||
@@ -148,2 +150,3 @@ | ||
| `preservePath` | Keep the full path of files instead of just the base name | ||
| `defParamCharset` | Default character set to use for values of part header parameters (e.g. filename) that are not extended parameters (that contain an explicit charset). Default: `'latin1'` | ||
@@ -350,2 +353,2 @@ In an average web app, only `dest` might be required, and configured as shown in | ||
| [ossf-scorecard-badge]: https://api.scorecard.dev/projects/github.com/expressjs/multer/badge | ||
| [ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer | ||
| [ossf-scorecard-visualizer]: https://ossf.github.io/scorecard-visualizer/#/projects/github.com/expressjs/multer |
+1
-2
@@ -5,3 +5,2 @@ var fs = require('fs') | ||
| var crypto = require('crypto') | ||
| var mkdirp = require('mkdirp') | ||
@@ -22,3 +21,3 @@ function getFilename (req, file, cb) { | ||
| if (typeof opts.destination === 'string') { | ||
| mkdirp.sync(opts.destination) | ||
| fs.mkdirSync(opts.destination, { recursive: true }) | ||
| this.getDestination = function ($0, $1, cb) { cb(null, opts.destination) } | ||
@@ -25,0 +24,0 @@ } else { |
30591
3.73%4
-42.86%453
5.84%352
1.15%- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed