89 lines
2.9 KiB
JavaScript
89 lines
2.9 KiB
JavaScript
var express = require('express')
|
|
const fs = require('fs');
|
|
const Busboy = require('busboy');
|
|
const uniqueFilename = require('unique-filename');
|
|
|
|
var router = express.Router()
|
|
const logger = require('../utils/logger.js')
|
|
|
|
//route to handle file upload in all POST requests
|
|
//file is saved to res.locals.savedFile and can be used in subsequent routes.
|
|
router.use(function (req, res,next) {
|
|
|
|
if(req.method == "POST")
|
|
{
|
|
logger.debug(`${__filename} path: ${req.path}`);
|
|
|
|
let bytes = 0;
|
|
let hitLimit = false;
|
|
let fileName = '';
|
|
var savedFile = uniqueFilename('/tmp/');
|
|
let busboy = new Busboy({
|
|
headers: req.headers,
|
|
limits: {
|
|
fields: 0, //no non-files allowed
|
|
files: 1,
|
|
fileSize: fileSizeLimit,
|
|
}});
|
|
busboy.on('filesLimit', function() {
|
|
logger.error(`upload file size limit hit. max file size ${fileSizeLimit} bytes.`)
|
|
});
|
|
busboy.on('fieldsLimit', function() {
|
|
let msg="Non-file field detected. Only files can be POSTed.";
|
|
logger.error(msg);
|
|
let err = new Error(msg);
|
|
err.statusCode = 400;
|
|
next(err);
|
|
});
|
|
|
|
busboy.on('file', function(
|
|
fieldname,
|
|
file,
|
|
filename,
|
|
encoding,
|
|
mimetype
|
|
) {
|
|
file.on('limit', function(file) {
|
|
hitLimit = true;
|
|
let msg = `${filename} exceeds max size limit. max file size ${fileSizeLimit} bytes.`
|
|
logger.error(msg);
|
|
res.writeHead(500, {'Connection': 'close'});
|
|
res.end(JSON.stringify({error: msg}));
|
|
});
|
|
let log = {
|
|
file: filename,
|
|
encoding: encoding,
|
|
mimetype: mimetype,
|
|
};
|
|
logger.debug(`file:${log.file}, encoding: ${log.encoding}, mimetype: ${log.mimetype}`);
|
|
file.on('data', function(data) {
|
|
bytes += data.length;
|
|
});
|
|
file.on('end', function(data) {
|
|
log.bytes = bytes;
|
|
logger.debug(`file: ${log.file}, encoding: ${log.encoding}, mimetype: ${log.mimetype}, bytes: ${log.bytes}`);
|
|
});
|
|
|
|
fileName = filename;
|
|
savedFile = savedFile + "-" + fileName;
|
|
logger.debug(`uploading ${fileName}`)
|
|
let written = file.pipe(fs.createWriteStream(savedFile));
|
|
if (written) {
|
|
logger.debug(`${fileName} saved, path: ${savedFile}`)
|
|
}
|
|
});
|
|
busboy.on('finish', function() {
|
|
if (hitLimit) {
|
|
utils.deleteFile(savedFile);
|
|
return;
|
|
}
|
|
logger.debug(`upload complete. file: ${fileName}`)
|
|
res.locals.savedFile = savedFile;
|
|
next();
|
|
});
|
|
return req.pipe(busboy);
|
|
}
|
|
next();
|
|
});
|
|
|
|
module.exports = router; |