diff --git a/models/attachments.js b/models/attachments.js index e3558d448..8fdc99d53 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -32,9 +32,12 @@ Attachments = new FilesCollection({ return ret; }, onAfterUpload(fileObj) { + // current storage is the filesystem, update object and database Object.keys(fileObj.versions).forEach(versionName => { - fileStoreStrategyFactory.getFileStrategy(this, fileObj, versionName).onAfterUpload(); - }) + fileObj.versions[versionName].storage = "fs"; + }); + Attachments.update({ _id: fileObj._id }, { $set: { "versions" : fileObj.versions } }); + moveToStorage(fileObj, "gridfs", fileStoreStrategyFactory); }, interceptDownload(http, fileObj, versionName) { const ret = fileStoreStrategyFactory.getFileStrategy(this, fileObj, versionName).interceptDownload(http); diff --git a/models/avatars.js b/models/avatars.js index 49cb10bfb..e179da244 100644 --- a/models/avatars.js +++ b/models/avatars.js @@ -27,9 +27,11 @@ Avatars = new FilesCollection({ return 'avatar-too-big'; }, onAfterUpload(fileObj) { + // current storage is the filesystem, update object and database Object.keys(fileObj.versions).forEach(versionName => { - fileStoreStrategyFactory.getFileStrategy(this, fileObj, versionName).onAfterUpload(); + fileObj.versions[versionName].storage = "fs"; }); + Avatars.update({ _id: fileObj._id }, { $set: { "versions" : fileObj.versions } }); }, interceptDownload(http, fileObj, versionName) { const ret = fileStoreStrategyFactory.getFileStrategy(this, fileObj, versionName).interceptDownload(http); diff --git a/models/lib/fileStoreStrategy.js b/models/lib/fileStoreStrategy.js index ff8cae7a2..c4d0cfe47 100644 --- a/models/lib/fileStoreStrategy.js +++ b/models/lib/fileStoreStrategy.js @@ -1,6 +1,5 @@ import fs from 'fs'; import { createObjectId } from './grid/createObjectId'; -import { createOnAfterUpload } from './fsHooks/createOnAfterUpload'; import { createInterceptDownload } from './fsHooks/createInterceptDownload'; import { createOnAfterRemove } from './fsHooks/createOnAfterRemove'; @@ -26,7 +25,16 @@ export default class FileStoreStrategyFactory { */ getFileStrategy(filesCollection, fileObj, versionName, storage) { if (!storage) { - storage = fileObj.versions[versionName].storage || "gridfs"; + storage = fileObj.versions[versionName].storage; + if (!storage) { + if (fileObj.meta.source == "import") { + // uploaded by import, so it's in GridFS (MongoDB) + storage = "gridfs"; + } else { + // newly uploaded, so it's at the filesystem + storage = "fs"; + } + } } let ret; if (["fs", "gridfs"].includes(storage)) { @@ -111,12 +119,6 @@ export class FileStoreStrategyGridFs extends FileStoreStrategy { this.gridFsBucket = gridFsBucket; } - /** after successfull upload */ - onAfterUpload() { - createOnAfterUpload(this.filesCollection, this.gridFsBucket, this.fileObj, this.versionName); - super.onAfterUpload(); - } - /** download the file * @param http the current http request */ diff --git a/models/lib/fsHooks/createOnAfterUpload.js b/models/lib/fsHooks/createOnAfterUpload.js deleted file mode 100644 index 173d02f3c..000000000 --- a/models/lib/fsHooks/createOnAfterUpload.js +++ /dev/null @@ -1,42 +0,0 @@ -import { Meteor } from 'meteor/meteor'; -import fs from 'fs'; - -export const createOnAfterUpload = function onAfterUpload(filesCollection, bucket, file, versionName) { - const self = filesCollection; - const metadata = { ...file.meta, versionName, fileId: file._id }; - fs.createReadStream(file.versions[versionName].path) - - // this is where we upload the binary to the bucket using bucket.openUploadStream - // see http://mongodb.github.io/node-mongodb-native/3.2/api/GridFSBucket.html#openUploadStream - .pipe( - bucket.openUploadStream(file.name, { - contentType: file.type || 'binary/octet-stream', - metadata, - }), - ) - - // and we unlink the file from the fs on any error - // that occurred during the upload to prevent zombie files - .on('error', err => { - console.error("[createOnAfterUpload error]", err); - self.unlink(self.collection.findOne(file._id), versionName); // Unlink files from FS - }) - - // once we are finished, we attach the gridFS Object id on the - // FilesCollection document's meta section and finally unlink the - // upload file from the filesystem - .on( - 'finish', - Meteor.bindEnvironment(ver => { - const property = `versions.${versionName}.meta.gridFsFileId`; - - self.collection.update(file._id, { - $set: { - [property]: ver._id.toHexString(), - }, - }); - - self.unlink(self.collection.findOne(file._id), versionName); // Unlink files from FS - }), - ); -};