Ghost/core/server/middleware/ghost-busboy.js
2014-03-01 20:37:15 -05:00

81 lines
2.1 KiB
JavaScript

var BusBoy = require('busboy'),
fs = require('fs-extra'),
path = require('path'),
os = require('os'),
crypto = require('crypto');
// ### ghostBusboy
// Process multipart file streams
function ghostBusBoy(req, res, next) {
var busboy,
stream,
tmpDir;
// busboy is only used for POST requests
if (req.method && !/post/i.test(req.method)) {
return next();
}
busboy = new BusBoy({ headers: req.headers });
tmpDir = os.tmpdir();
req.files = req.files || {};
req.body = req.body || {};
busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
var filePath,
tmpFileName,
md5 = crypto.createHash('md5');
// If the filename is invalid, skip the stream
if (!filename) {
return file.resume();
}
// Create an MD5 hash of original filename
md5.update(filename, 'utf8');
tmpFileName = (new Date()).getTime() + md5.digest('hex');
filePath = path.join(tmpDir, tmpFileName || 'temp.tmp');
file.on('end', function () {
req.files[fieldname] = {
type: mimetype,
encoding: encoding,
name: filename,
path: filePath
};
});
file.on('error', function (error) {
console.log('Error', 'Something went wrong uploading the file', error);
});
stream = fs.createWriteStream(filePath);
stream.on('error', function (error) {
console.log('Error', 'Something went wrong uploading the file', error);
});
file.pipe(stream);
});
busboy.on('error', function (error) {
console.log('Error', 'Something went wrong parsing the form', error);
res.send(500, {code: 500, message: 'Could not parse upload completely.'});
});
busboy.on('field', function (fieldname, val) {
req.body[fieldname] = val;
});
busboy.on('finish', function () {
next();
});
req.pipe(busboy);
}
module.exports = ghostBusBoy;