Files
NodeBB/src/controllers/admin/uploads.js

176 lines
5.0 KiB
JavaScript
Raw Normal View History

2017-02-18 01:56:23 -07:00
'use strict';
2016-05-16 12:34:47 +03:00
var path = require('path');
var async = require('async');
var nconf = require('nconf');
var mime = require('mime');
var meta = require('../../meta');
2016-05-16 12:34:47 +03:00
var file = require('../../file');
var image = require('../../image');
var plugins = require('../../plugins');
2016-05-06 04:42:59 -04:00
var allowedImageTypes = ['image/png', 'image/jpeg', 'image/pjpeg', 'image/jpg', 'image/gif', 'image/svg+xml'];
2017-05-10 15:34:36 -04:00
var uploadsController = module.exports;
uploadsController.uploadCategoryPicture = function (req, res, next) {
2015-01-10 18:59:24 -05:00
var uploadedFile = req.files.files[0];
2016-05-06 04:42:59 -04:00
var params = null;
try {
params = JSON.parse(req.body.params);
} catch (e) {
2017-05-24 00:02:30 -04:00
file.delete(uploadedFile.path);
2017-05-10 15:51:19 -04:00
return next(new Error('[[error:invalid-json]]'));
}
2016-05-06 04:42:59 -04:00
if (validateUpload(req, res, next, uploadedFile, allowedImageTypes)) {
var filename = 'category-' + params.cid + path.extname(uploadedFile.name);
2015-01-12 17:33:11 -05:00
uploadImage(filename, 'category', uploadedFile, req, res, next);
}
};
uploadsController.uploadFavicon = function (req, res, next) {
2015-01-10 18:59:24 -05:00
var uploadedFile = req.files.files[0];
var allowedTypes = ['image/x-icon', 'image/vnd.microsoft.icon'];
2015-02-17 15:12:31 -05:00
if (validateUpload(req, res, next, uploadedFile, allowedTypes)) {
file.saveFileToLocal('favicon.ico', 'system', uploadedFile.path, function (err, image) {
2017-05-24 00:02:30 -04:00
file.delete(uploadedFile.path);
2015-01-12 17:33:11 -05:00
if (err) {
return next(err);
}
2017-02-18 12:30:49 -07:00
res.json([{ name: uploadedFile.name, url: image.url }]);
});
}
};
uploadsController.uploadTouchIcon = function (req, res, next) {
2017-02-17 20:20:42 -07:00
var uploadedFile = req.files.files[0];
var allowedTypes = ['image/png'];
var sizes = [36, 48, 72, 96, 144, 192];
if (validateUpload(req, res, next, uploadedFile, allowedTypes)) {
file.saveFileToLocal('touchicon-orig.png', 'system', uploadedFile.path, function (err, imageObj) {
2016-08-16 19:46:59 +02:00
if (err) {
return next(err);
}
// Resize the image into squares for use as touch icons at various DPIs
async.each(sizes, function (size, next) {
async.series([
async.apply(file.saveFileToLocal, 'touchicon-' + size + '.png', 'system', uploadedFile.path),
async.apply(image.resizeImage, {
path: path.join(nconf.get('upload_path'), 'system', 'touchicon-' + size + '.png'),
extension: 'png',
width: size,
2017-02-17 19:31:21 -07:00
height: size,
}),
], next);
}, function (err) {
2017-05-24 00:02:30 -04:00
file.delete(uploadedFile.path);
if (err) {
return next(err);
}
2017-02-18 12:30:49 -07:00
res.json([{ name: uploadedFile.name, url: imageObj.url }]);
});
});
}
};
uploadsController.uploadLogo = function (req, res, next) {
2014-04-28 01:52:25 -04:00
upload('site-logo', req, res, next);
};
uploadsController.uploadSound = function (req, res, next) {
2016-02-23 16:06:02 -05:00
var uploadedFile = req.files.files[0];
var mimeType = mime.lookup(uploadedFile.name);
if (!/^audio\//.test(mimeType)) {
return next(Error('[[error:invalid-data]]'));
}
2017-05-10 15:34:36 -04:00
async.waterfall([
function (next) {
file.saveFileToLocal(uploadedFile.name, 'sounds', uploadedFile.path, next);
},
function (uploadedSound, next) {
meta.sounds.build(next);
},
], function (err) {
2017-05-24 00:02:30 -04:00
file.delete(uploadedFile.path);
2016-02-23 16:06:02 -05:00
if (err) {
return next(err);
}
2017-05-10 15:34:36 -04:00
res.json([{}]);
2016-02-23 16:06:02 -05:00
});
};
uploadsController.uploadDefaultAvatar = function (req, res, next) {
upload('avatar-default', req, res, next);
2014-04-28 01:52:25 -04:00
};
uploadsController.uploadOgImage = function (req, res, next) {
2016-05-16 12:34:47 +03:00
upload('og:image', req, res, next);
};
2014-04-28 01:52:25 -04:00
function upload(name, req, res, next) {
2015-01-10 18:59:24 -05:00
var uploadedFile = req.files.files[0];
2016-05-06 04:42:59 -04:00
if (validateUpload(req, res, next, uploadedFile, allowedImageTypes)) {
2015-01-10 18:59:24 -05:00
var filename = name + path.extname(uploadedFile.name);
2015-03-06 13:05:22 -05:00
uploadImage(filename, 'system', uploadedFile, req, res, next);
2015-01-10 18:59:24 -05:00
}
}
2015-01-12 17:33:11 -05:00
function validateUpload(req, res, next, uploadedFile, allowedTypes) {
2015-01-10 18:59:24 -05:00
if (allowedTypes.indexOf(uploadedFile.type) === -1) {
2017-05-24 00:02:30 -04:00
file.delete(uploadedFile.path);
2017-02-18 12:30:49 -07:00
res.json({ error: '[[error:invalid-image-type, ' + allowedTypes.join(', ') + ']]' });
2015-01-10 18:59:24 -05:00
return false;
}
2015-01-10 18:59:24 -05:00
return true;
}
2015-01-12 17:33:11 -05:00
function uploadImage(filename, folder, uploadedFile, req, res, next) {
2017-05-10 15:34:36 -04:00
async.waterfall([
function (next) {
if (plugins.hasListeners('filter:uploadImage')) {
plugins.fireHook('filter:uploadImage', { image: uploadedFile, uid: req.user.uid }, next);
} else {
file.saveFileToLocal(filename, folder, uploadedFile.path, next);
2015-09-06 00:49:39 -04:00
}
2017-05-10 15:34:36 -04:00
},
function (imageData, next) {
// Post-processing for site-logo
if (path.basename(filename, path.extname(filename)) === 'site-logo' && folder === 'system') {
var uploadPath = path.join(nconf.get('upload_path'), folder, 'site-logo-x50.png');
async.series([
async.apply(image.resizeImage, {
path: uploadedFile.path,
target: uploadPath,
extension: 'png',
height: 50,
}),
2017-07-28 16:50:18 -04:00
async.apply(meta.configs.set, 'brand:emailLogo', path.join(nconf.get('upload_url'), 'system/site-logo-x50.png')),
], function (err) {
next(err, imageData);
});
} else {
setImmediate(next, null, imageData);
}
},
2017-05-10 15:34:36 -04:00
], function (err, image) {
2017-05-24 00:02:30 -04:00
file.delete(uploadedFile.path);
2015-01-12 17:33:11 -05:00
if (err) {
return next(err);
}
2017-02-18 12:30:49 -07:00
res.json([{ name: uploadedFile.name, url: image.url.startsWith('http') ? image.url : nconf.get('relative_path') + image.url }]);
2017-05-10 15:34:36 -04:00
});
2014-04-28 01:52:25 -04:00
}