mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-08-27 00:05:40 +02:00
fix: #7597, fix progress bar of cover/profile uploads
send big cover images in chunks
This commit is contained in:
@@ -69,6 +69,14 @@ function onConnection(socket) {
|
||||
socket.on('*', function (payload) {
|
||||
onMessage(socket, payload);
|
||||
});
|
||||
|
||||
socket.on('disconnect', function () {
|
||||
onDisconnect(socket);
|
||||
});
|
||||
}
|
||||
|
||||
function onDisconnect(socket) {
|
||||
require('./uploads').clear(socket.id);
|
||||
}
|
||||
|
||||
function onConnect(socket) {
|
||||
@@ -148,7 +156,8 @@ async function onMessage(socket, payload) {
|
||||
|
||||
function requireModules() {
|
||||
var modules = ['admin', 'categories', 'groups', 'meta', 'modules',
|
||||
'notifications', 'plugins', 'posts', 'topics', 'user', 'blacklist', 'flags',
|
||||
'notifications', 'plugins', 'posts', 'topics', 'user', 'blacklist',
|
||||
'flags', 'uploads',
|
||||
];
|
||||
|
||||
modules.forEach(function (module) {
|
||||
|
||||
52
src/socket.io/uploads.js
Normal file
52
src/socket.io/uploads.js
Normal file
@@ -0,0 +1,52 @@
|
||||
'use strict';
|
||||
|
||||
const socketUser = require('./user');
|
||||
const socketGroup = require('./groups');
|
||||
const image = require('../image');
|
||||
const meta = require('../meta');
|
||||
|
||||
const inProgress = {};
|
||||
|
||||
const uploads = module.exports;
|
||||
|
||||
uploads.upload = async function (socket, data) {
|
||||
const methodToFunc = {
|
||||
'user.uploadCroppedPicture': socketUser.uploadCroppedPicture,
|
||||
'user.updateCover': socketUser.updateCover,
|
||||
'groups.cover.update': socketGroup.cover.update,
|
||||
};
|
||||
if (!data || !data.chunk || !data.params || !data.params.method || !methodToFunc[data.params.method]) {
|
||||
throw new Error('[[error:invalid-data]]');
|
||||
}
|
||||
|
||||
inProgress[socket.id] = inProgress[socket.id] || {};
|
||||
const socketUploads = inProgress[socket.id];
|
||||
const method = data.params.method;
|
||||
|
||||
socketUploads[method] = socketUploads[method] || { imageData: '' };
|
||||
socketUploads[method].imageData += data.chunk;
|
||||
|
||||
try {
|
||||
const maxSize = data.params.method === 'user.uploadCroppedPicture' ?
|
||||
meta.config.maximumProfileImageSize : meta.config.maximumCoverImageSize;
|
||||
const size = image.sizeFromBase64(socketUploads[method].imageData);
|
||||
|
||||
if (size > maxSize * 1024) {
|
||||
throw new Error('[[error:file-too-big, ' + maxSize + ']]');
|
||||
}
|
||||
if (socketUploads[method].imageData.length < data.params.size) {
|
||||
return;
|
||||
}
|
||||
data.params.imageData = socketUploads[method].imageData;
|
||||
const result = await methodToFunc[data.params.method](socket, data.params);
|
||||
delete socketUploads[method];
|
||||
return result;
|
||||
} catch (err) {
|
||||
delete inProgress[socket.id];
|
||||
throw err;
|
||||
}
|
||||
};
|
||||
|
||||
uploads.clear = function (sid) {
|
||||
delete inProgress[sid];
|
||||
};
|
||||
Reference in New Issue
Block a user