Skip to content

Commit 26e009b

Browse files
committed
Add "preserverExtension" option handler
Misc reformatting.
1 parent 63c759a commit 26e009b

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ Pass in non-Busboy options directly to the middleware. These are express-fileupl
121121
Option | Acceptable Values | Details
122122
--- | --- | ---
123123
safeFileNames | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li><li>regex</li></ul> | Strips characters from the upload's filename. You can use custom regex to determine what to strip. If set to `true`, non-alphanumeric characters _except_ dashes and underscores will be stripped. This option is off by default.<br /><br />**Example #1 (strip slashes from file names):** `app.use(fileUpload({ safeFileNames: /\\/g }))`<br />**Example #2:** `app.use(fileUpload({ safeFileNames: true }))`
124+
preserveExtension | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li><li><code>*Number*</code></li></ul> | Preserves filename extension when using <code>safeFileNames</code> option. If set to <code>true</code>, will default to an extension length of 3. If set to <code>*Number*</code>, this will be the max allowable extension length. If an extension is smaller than the extension length, it remains untouched. If the extension is longer, it is shifted.<br /><br />**Example #1 (true):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: true }));</code><br />*myFileName.ext* --> *myFileName.ext*<br /><br />**Example #2 (max extension length 2, extension truncated):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: 2 }));</code><br />*myFileName.ext* --> *myFileNamee.xt*
124125

125126
# Help Wanted
126127
Pull Requests are welcomed!

lib/index.js

+28-5
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ module.exports = function(options) {
1515

1616
return function(req, res, next) {
1717
if (!hasBody(req) || !hasAcceptableMethod(req) || !hasAcceptableMime(req))
18-
return next();
18+
return next();
1919

2020
processMultipart(options, req, res, next);
2121
};
@@ -85,14 +85,37 @@ function processMultipart(options, req, res, next) {
8585
// see: https://github.com/richardgirges/express-fileupload/issues/14
8686
// firefox uploads empty file in case of cache miss when f5ing page.
8787
// resulting in unexpected behavior. if there is no file data, the file is invalid.
88-
if(!buf.length)
88+
if (!buf.length)
8989
return;
9090

9191
if (options.safeFileNames) {
92+
let extensionLength = 3;
93+
let extension = '';
94+
9295
if (typeof options.safeFileNames === 'object')
9396
safeFileNameRegex = options.safeFileNames;
9497

95-
filename = filename.replace(safeFileNameRegex, '');
98+
if (options.preserveExtension) {
99+
if (typeof options.preserveExtension === 'number')
100+
extensionLength = options.preserveExtension;
101+
102+
let filenameParts = filename.split('.');
103+
let filenamePartsLen = filenameParts.length;
104+
if (filenamePartsLen > 1) {
105+
extension = filenameParts.pop();
106+
107+
if (extension.length > extensionLength) {
108+
filenameParts[filenameParts.length - 1] +=
109+
'.' + extension.substr(0, extension.length - extensionLength);
110+
extension = extension.substr(-extensionLength);
111+
}
112+
113+
extension = '.' + extension.replace(safeFileNameRegex, '');
114+
filename = filenameParts.join('.');
115+
}
116+
}
117+
118+
filename = filename.replace(safeFileNameRegex, '').concat(extension);
96119
}
97120

98121
let newFile = {
@@ -123,9 +146,9 @@ function processMultipart(options, req, res, next) {
123146
} else {
124147
// Array fields
125148
if (req.files[fieldname] instanceof Array)
126-
req.files[fieldname].push(newFile);
149+
req.files[fieldname].push(newFile);
127150
else
128-
req.files[fieldname] = [req.files[fieldname], newFile];
151+
req.files[fieldname] = [req.files[fieldname], newFile];
129152
}
130153
});
131154
});

0 commit comments

Comments
 (0)