Merge pull request #116 from RomanBurunkov/master

Fix multiple files upload in the same time with tempfile handler.
dev 1.1.1-alpha.2
Richard Girges 5 years ago committed by GitHub
commit f9d7bbd792
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      README.md
  2. 13
      lib/processMultipart.js
  3. 58
      lib/tempFileHandler.js

@ -73,7 +73,7 @@ safeFileNames | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true
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 shifted):**<br /><code>app.use(fileUpload({ safeFileNames: true, preserveExtension: 2 }));</code><br />*myFileName.ext* --> *myFileNamee.xt*
abortOnLimit | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></ul> | Returns a HTTP 413 when the file is bigger than the size limit if true. Otherwise, it will add a <code>truncate = true</code> to the resulting file structure.
useTempFiles | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></ul> | Will use temporary files at the specified tempDir for managing uploads rather than using buffers in memory. This avoids memory issues when uploading large files.
tempFileDir | <ul><li><code>String</code>&nbsp;**(path)**</li></ul> | Used with the <code>useTempFiles</code> option. Path to the directory where temp files will be stored during the upload process. Add trailing slash.
tempFileDir | <ul><li><code>String</code>&nbsp;**(path)**</li></ul> | Used with the <code>useTempFiles</code> option. Path to the directory where temp files will be stored during the upload process. Feel free to add trailing slash, but it is not necessary.
parseNested | <ul><li><code>false</code>&nbsp;**(default)**</li><li><code>true</code></li></ul> | By default, req.body and req.files are flattened like this: <code>{'name': 'John', 'hobbies[0]': 'Cinema', 'hobbies[1]': 'Bike'}</code><br /><br/>When this option is enabled they are parsed in order to be nested like this: <code>{'name': 'John', 'hobbies': ['Cinema', 'Bike']}</code>
# Help Wanted

@ -1,11 +1,6 @@
const Busboy = require('busboy');
const fileFactory = require('./fileFactory');
const {
getTempFilePath,
complete,
cleanupStream,
tempFileHandler
} = require('./tempFileHandler');
const {tempFileHandler} = require('./tempFileHandler');
const processNested = require('./processNested');
/**
@ -64,8 +59,12 @@ module.exports = function processMultipart(options, req, res, next) {
return console.log('Uploading %s -> %s', fieldname, filename); // eslint-disable-line
}
};
const tempHandlerGen = tempFileHandler(options, fieldname, filename);
const {getTempFilePath, complete, cleanupStream} = tempHandlerGen;
const dataHandler = options.useTempFiles
? tempFileHandler(options, fieldname, filename)
? tempHandlerGen.handler
: memHandler;
file.on('limit', () => {

@ -1,42 +1,40 @@
const fs = require('fs');
let writeStream;
let tempFilePath;
module.exports.getTempFilePath = function() {
return tempFilePath;
};
module.exports.cleanupStream = function() {
writeStream.end();
fs.unlink(tempFilePath, function(err) {
if (err) throw err;
});
};
module.exports.complete = function(){
writeStream.end();
};
const path = require('path');
module.exports.tempFileHandler = function(options, fieldname, filename) {
const dir = options.tempFileDir || process.cwd() + '/tmp/';
const dir = path.normalize(options.tempFileDir || process.cwd() + '/tmp/');
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
tempFilePath = dir + 'tmp' + Date.now();
writeStream = fs.createWriteStream(tempFilePath);
let tempFilePath = path.join(dir, 'tmp' + Date.now());
let writeStream = fs.createWriteStream(tempFilePath);
let fileSize = 0; // eslint-disable-line
return function(data) {
writeStream.write(data);
fileSize += data.length;
if (options.debug) {
return console.log( // eslint-disable-line
`Uploaded ${data.length} bytes for `,
fieldname,
filename
);
return {
handler: function(data) {
writeStream.write(data);
fileSize += data.length;
if (options.debug) {
return console.log( // eslint-disable-line
`Uploaded ${data.length} bytes for `,
fieldname,
filename
);
}
},
getTempFilePath: function(){
return tempFilePath;
},
cleanupStream: function(){
writeStream.end();
fs.unlink(tempFilePath, function(err) {
if (err) throw err;
});
},
complete: function(){
writeStream.end();
}
};
};

Loading…
Cancel
Save