🐛 Fixed files staying in temp directory after upload is done

closes #10174

- Introduced upload middleware that cleans up temporary files stored by mutler after the request is finished
- Removed redundant fs.remove calls as this work is now handled in newly introduced middleware
This commit is contained in:
notanengineercom 2018-12-12 14:02:09 +01:00 committed by Naz Gargol
parent d20bdfd9c1
commit 631716053a
7 changed files with 53 additions and 34 deletions

View File

@ -140,14 +140,6 @@ themes = {
return themeUtils.toJSON(zip.shortName, checkedTheme);
})
.finally(() => {
// @TODO we should probably do this as part of saving the theme
// remove zip upload from multer
// happens in background
fs.remove(zip.path)
.catch((err) => {
common.logging.error(new common.errors.GhostError({err: err}));
});
// @TODO we should probably do this as part of saving the theme
// remove extracted dir from gscan
// happens in background

View File

@ -1,4 +1,3 @@
const fs = require('fs-extra');
const Promise = require('bluebird');
const models = require('../../models');
const fsLib = require('../../lib/fs');
@ -208,9 +207,6 @@ const subscribers = {
}
}
};
}).finally(() => {
// Remove uploaded file from tmp location
return fs.unlink(filePath);
});
}
}

View File

@ -1,4 +1,3 @@
const fs = require('fs-extra');
const storage = require('../../adapters/storage');
module.exports = {
@ -10,22 +9,11 @@ module.exports = {
const store = storage.getStorage();
if (frame.files) {
return Promise.map(frame.files, (file) => {
return store
.save(file)
.finally(() => {
// Remove uploaded file from tmp location
return fs.unlink(file.path);
});
}).then((paths) => {
return paths[0];
});
return Promise
.map(frame.files, file => store.save(file))
.then(paths => paths[0]);
}
return store.save(frame.file).finally(() => {
// Remove uploaded file from tmp location
return fs.unlink(frame.file.path);
});
return store.save(frame.file);
}
}
};

View File

@ -11,8 +11,7 @@ const cors = require('../../shared/middlewares/api/cors');
const brute = require('../../shared/middlewares/brute');
// Handling uploads & imports
const tmpdir = require('os').tmpdir;
const upload = require('multer')({dest: tmpdir()});
const upload = require('../../shared/middlewares/upload');
const validation = require('../../shared/middlewares/validation');
const image = require('../../shared/middlewares/image');

View File

@ -1,6 +1,4 @@
const express = require('express');
const os = require('os');
const multer = require('multer');
const api = require('../../../../api');
const apiv2 = require('../../../../api/v2');
const mw = require('./middleware');
@ -9,8 +7,7 @@ const auth = require('../../../../services/auth');
const shared = require('../../../shared');
// Handling uploads & imports
const tmpdir = os.tmpdir;
const upload = multer({dest: tmpdir()});
const upload = shared.middlewares.upload;
module.exports = function apiRoutes() {
const router = express.Router();

View File

@ -19,6 +19,10 @@ module.exports = {
return require('./brute');
},
get upload() {
return require('./upload');
},
get cacheControl() {
return require('./cache-control');
},

View File

@ -0,0 +1,43 @@
const config = require('../../../config');
const os = require('os');
const multer = require('multer');
const fs = require('fs-extra');
const common = require('../../../lib/common');
const upload = {
enabledClear: config.get('uploadClear') || true,
multer: multer({dest: os.tmpdir()})
};
const deleteSingleFile = file => fs.unlink(file.path).catch(err => common.logging.error(err));
const single = name => (req, res, next) => {
const singleUpload = upload.multer.single(name);
singleUpload(req, res, (err) => {
if (err) {
return next(err);
}
if (upload.enabledClear) {
const deleteFiles = () => {
res.removeListener('finish', deleteFiles);
res.removeListener('close', deleteFiles);
if (!req.disableUploadClear) {
if (req.files) {
return req.files.forEach(deleteSingleFile);
}
if (req.file) {
return deleteSingleFile(req.file);
}
}
};
if (!req.disableUploadClear) {
res.on('finish', deleteFiles);
res.on('close', deleteFiles);
}
}
next();
});
};
module.exports = {single};