mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-02-03 23:00:14 -05:00
🐛 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:
parent
d20bdfd9c1
commit
631716053a
7 changed files with 53 additions and 34 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -19,6 +19,10 @@ module.exports = {
|
|||
return require('./brute');
|
||||
},
|
||||
|
||||
get upload() {
|
||||
return require('./upload');
|
||||
},
|
||||
|
||||
get cacheControl() {
|
||||
return require('./cache-control');
|
||||
},
|
||||
|
|
43
core/server/web/shared/middlewares/upload.js
Normal file
43
core/server/web/shared/middlewares/upload.js
Normal 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};
|
Loading…
Add table
Reference in a new issue