mirror of
https://github.com/NodeBB/NodeBB.git
synced 2025-11-13 01:15:47 +01:00
closes #2222
This commit is contained in:
14
src/image.js
14
src/image.js
@@ -1,11 +1,11 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var fs = require('fs'),
|
var fs = require('fs');
|
||||||
Jimp = require('jimp'),
|
var Jimp = require('jimp');
|
||||||
async = require('async'),
|
var async = require('async');
|
||||||
plugins = require('./plugins');
|
var plugins = require('./plugins');
|
||||||
|
|
||||||
var image = {};
|
var image = module.exports;
|
||||||
|
|
||||||
image.resizeImage = function(data, callback) {
|
image.resizeImage = function(data, callback) {
|
||||||
if (plugins.hasListeners('filter:image.resize')) {
|
if (plugins.hasListeners('filter:image.resize')) {
|
||||||
@@ -106,12 +106,10 @@ image.size = function(path, callback) {
|
|||||||
callback(err, data ? data.bitmap : null);
|
callback(err, data ? data.bitmap : null);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
image.convertImageToBase64 = function(path, callback) {
|
image.convertImageToBase64 = function(path, callback) {
|
||||||
fs.readFile(path, function(err, data) {
|
fs.readFile(path, function(err, data) {
|
||||||
callback(err, data ? data.toString('base64') : null);
|
callback(err, data ? data.toString('base64') : null);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = image;
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var express = require('express'),
|
var express = require('express');
|
||||||
nconf = require('nconf'),
|
var nconf = require('nconf');
|
||||||
winston = require('winston'),
|
var winston = require('winston');
|
||||||
user = require('./../user'),
|
var user = require('./../user');
|
||||||
categories = require('./../categories'),
|
var categories = require('./../categories');
|
||||||
topics = require('./../topics'),
|
var topics = require('./../topics');
|
||||||
posts = require('./../posts');
|
var posts = require('./../posts');
|
||||||
|
|
||||||
module.exports = function(app, middleware, controllers) {
|
module.exports = function(app, middleware, controllers) {
|
||||||
var router = express.Router();
|
var router = express.Router();
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ var social = require('./social');
|
|||||||
|
|
||||||
(function(Topics) {
|
(function(Topics) {
|
||||||
|
|
||||||
|
|
||||||
require('./topics/data')(Topics);
|
require('./topics/data')(Topics);
|
||||||
require('./topics/create')(Topics);
|
require('./topics/create')(Topics);
|
||||||
require('./topics/delete')(Topics);
|
require('./topics/delete')(Topics);
|
||||||
@@ -29,6 +28,7 @@ var social = require('./social');
|
|||||||
require('./topics/teaser')(Topics);
|
require('./topics/teaser')(Topics);
|
||||||
require('./topics/suggested')(Topics);
|
require('./topics/suggested')(Topics);
|
||||||
require('./topics/tools')(Topics);
|
require('./topics/tools')(Topics);
|
||||||
|
require('./topics/thumb')(Topics);
|
||||||
|
|
||||||
Topics.exists = function(tid, callback) {
|
Topics.exists = function(tid, callback) {
|
||||||
db.isSortedSetMember('topics:tid', tid, callback);
|
db.isSortedSetMember('topics:tid', tid, callback);
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ module.exports = function(Topics) {
|
|||||||
var topicData;
|
var topicData;
|
||||||
|
|
||||||
async.waterfall([
|
async.waterfall([
|
||||||
|
function(next) {
|
||||||
|
Topics.resizeAndUploadThumb(data, next);
|
||||||
|
},
|
||||||
function(next) {
|
function(next) {
|
||||||
db.incrObjectField('global', 'nextTid', next);
|
db.incrObjectField('global', 'nextTid', next);
|
||||||
},
|
},
|
||||||
|
|||||||
91
src/topics/thumb.js
Normal file
91
src/topics/thumb.js
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var async = require('async');
|
||||||
|
var nconf = require('nconf');
|
||||||
|
var winston = require('winston');
|
||||||
|
var path = require('path');
|
||||||
|
var fs = require('fs');
|
||||||
|
var request = require('request');
|
||||||
|
var mime = require('mime');
|
||||||
|
var validator = require('validator');
|
||||||
|
|
||||||
|
var meta = require('../meta');
|
||||||
|
var image = require('../image');
|
||||||
|
var file = require('../file');
|
||||||
|
var plugins = require('../plugins');
|
||||||
|
|
||||||
|
module.exports = function(Topics) {
|
||||||
|
|
||||||
|
Topics.resizeAndUploadThumb = function(data, callback) {
|
||||||
|
if (!data.thumb || !validator.isURL(data.thumb)) {
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
var pathToUpload;
|
||||||
|
var filename;
|
||||||
|
|
||||||
|
async.waterfall([
|
||||||
|
function(next) {
|
||||||
|
request.head(data.thumb, next);
|
||||||
|
},
|
||||||
|
function(res, body, next) {
|
||||||
|
|
||||||
|
var type = res.headers['content-type'];
|
||||||
|
if (!type.match(/image./)) {
|
||||||
|
return next(new Error('[[error:invalid-file]]'));
|
||||||
|
}
|
||||||
|
|
||||||
|
var extension = path.extname(data.thumb);
|
||||||
|
if (!extension) {
|
||||||
|
extension = '.' + mime.extension(type);
|
||||||
|
}
|
||||||
|
filename = Date.now() + '-topic-thumb' + extension;
|
||||||
|
pathToUpload = path.join(nconf.get('base_dir'), nconf.get('upload_path'), 'files', filename);
|
||||||
|
|
||||||
|
request(data.thumb).pipe(fs.createWriteStream(pathToUpload)).on('close', next);
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
file.isFileTypeAllowed(pathToUpload, next);
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
var size = parseInt(meta.config.topicThumbSize, 10) || 120;
|
||||||
|
image.resizeImage({
|
||||||
|
path: pathToUpload,
|
||||||
|
extension: path.extname(pathToUpload),
|
||||||
|
width: size,
|
||||||
|
height: size
|
||||||
|
}, next);
|
||||||
|
},
|
||||||
|
function(next) {
|
||||||
|
if (!plugins.hasListeners('filter:uploadImage')) {
|
||||||
|
data.thumb = path.join(nconf.get('upload_url'), 'files', filename);
|
||||||
|
return callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins.fireHook('filter:uploadImage', {image: {path: pathToUpload, name: ''}, uid: data.uid}, next);
|
||||||
|
},
|
||||||
|
function(uploadedFile, next) {
|
||||||
|
deleteFile(pathToUpload);
|
||||||
|
data.thumb = uploadedFile.url;
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
], function(err) {
|
||||||
|
if (err) {
|
||||||
|
deleteFile(pathToUpload);
|
||||||
|
}
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function deleteFile(path) {
|
||||||
|
if (path) {
|
||||||
|
fs.unlink(path, function(err) {
|
||||||
|
if (err) {
|
||||||
|
winston.error(err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user