ffmpeg-api/src/routes/uploadfile.js
2020-04-21 12:15:01 +03:00

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;