Skip to content
Snippets Groups Projects
Commit d40d639d authored by Diego Sampaio's avatar Diego Sampaio
Browse files

Add GridFS support to avatars

parent a2de9f51
No related branches found
No related tags found
No related merge requests found
......@@ -72,6 +72,79 @@ if (UploadFS) {
return true;
}
});
Meteor.fileStoreAvatar = new UploadFS.store.GridFS({
collection: RocketChat.models.Uploads.model,
name: 'rocketchat_uploads_avatar',
collectionName: 'rocketchat_uploads',
// filter: new UploadFS.Filter({
// onCheck: FileUpload.validateFileUpload
// }),
beforeSave() {
console.log('beforeSave ->', arguments);
},
beforeWrite() {
console.log('beforeWrite ->', arguments);
return {
username: 'testando'
};
},
transformWrite(readStream, writeStream, fileId, file) {
if (RocketChatFile.enabled === false || !/^image\/.+/.test(file.type)) {
return readStream.pipe(writeStream);
}
let stream = undefined;
const identify = function(err, data) {
if (err) {
return stream.pipe(writeStream);
}
file.identify = {
format: data.format,
size: data.size
};
if (data.Orientation && !['', 'Unknown', 'Undefined'].includes(data.Orientation)) {
RocketChatFile.gm(stream).autoOrient().stream().pipe(writeStream);
} else {
stream.pipe(writeStream);
}
};
stream = RocketChatFile.gm(readStream).identify(identify).stream();
},
onRead(fileId, file, req, res) {
if (RocketChat.settings.get('FileUpload_ProtectFiles')) {
let uid;
let token;
if (req && req.headers && req.headers.cookie) {
const rawCookies = req.headers.cookie;
if (rawCookies) {
uid = cookie.get('rc_uid', rawCookies) ;
token = cookie.get('rc_token', rawCookies);
}
}
if (!uid) {
uid = req.query.rc_uid;
token = req.query.rc_token;
}
if (!uid || !token || !RocketChat.models.Users.findOneByIdAndLoginToken(uid, token)) {
res.writeHead(403);
return false;
}
}
res.setHeader('content-disposition', `attachment; filename="${ encodeURIComponent(file.name) }"`);
return true;
}
});
};
Meteor.startup(function() {
......
/* globals FileUploadBase, UploadFS, FileUpload:true */
FileUpload.GridFS = class FileUploadGridFS extends FileUploadBase {
constructor(meta, file) {
constructor(directive, meta, file) {
super(meta, file);
this.store = directive === 'avatar' ? Meteor.fileStoreAvatar : Meteor.fileStore;
}
start(callback) {
this.handler = new UploadFS.Uploader({
store: Meteor.fileStore,
data: file,
file: meta,
store: this.store,
data: this.file,
file: this.meta,
onError: (err) => {
const uploading = Session.get('uploading');
if (uploading != null) {
const item = _.findWhere(uploading, {
id: this.id
});
if (item != null) {
item.error = err.reason;
item.percentage = 0;
}
return Session.set('uploading', uploading);
}
return callback(err);
},
onComplete: (fileData) => {
const file = _.pick(fileData, '_id', 'type', 'size', 'name', 'identify', 'description');
file.url = fileData.url.replace(Meteor.absoluteUrl(), '/');
Meteor.call('sendFileMessage', this.meta.rid, null, file, () => {
Meteor.setTimeout(() => {
const uploading = Session.get('uploading');
if (uploading != null) {
const item = _.findWhere(uploading, {
id: this.id
});
return Session.set('uploading', _.without(uploading, item));
}
return callback(null, file);
}, 2000);
});
}
......@@ -41,9 +27,7 @@ FileUpload.GridFS = class FileUploadGridFS extends FileUploadBase {
this.handler.onProgress = (file, progress) => {
this.onProgress(progress);
};
}
start() {
return this.handler.start();
}
......
......@@ -75,7 +75,7 @@ Template.avatarPrompt.events
type: files[0].type
# description: document.getElementById('file-description').value
upload = fileUploadHandler 'rocketchat-avatars-gs', record, files[0]
upload = fileUploadHandler 'avatar', record, files[0]
# upload.onProgress = (progress) ->
# console.log 'progress ->', progress
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment