diff --git a/core/server/api/v0.1/themes.js b/core/server/api/v0.1/themes.js index 8f09f1bea8..f27e4a16cb 100644 --- a/core/server/api/v0.1/themes.js +++ b/core/server/api/v0.1/themes.js @@ -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 diff --git a/core/server/api/v2/subscribers.js b/core/server/api/v2/subscribers.js index 70006ca619..9b4bc9f4ee 100644 --- a/core/server/api/v2/subscribers.js +++ b/core/server/api/v2/subscribers.js @@ -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); }); } } diff --git a/core/server/api/v2/upload.js b/core/server/api/v2/upload.js index f9c3231e24..7e359ea9c9 100644 --- a/core/server/api/v2/upload.js +++ b/core/server/api/v2/upload.js @@ -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); } } }; diff --git a/core/server/web/api/v0.1/routes.js b/core/server/web/api/v0.1/routes.js index a2cd3bcd4f..2b294cc337 100644 --- a/core/server/web/api/v0.1/routes.js +++ b/core/server/web/api/v0.1/routes.js @@ -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'); diff --git a/core/server/web/api/v2/admin/routes.js b/core/server/web/api/v2/admin/routes.js index e318826863..4645ca4eb9 100644 --- a/core/server/web/api/v2/admin/routes.js +++ b/core/server/web/api/v2/admin/routes.js @@ -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(); diff --git a/core/server/web/shared/middlewares/index.js b/core/server/web/shared/middlewares/index.js index 15ba078312..0845b3100d 100644 --- a/core/server/web/shared/middlewares/index.js +++ b/core/server/web/shared/middlewares/index.js @@ -19,6 +19,10 @@ module.exports = { return require('./brute'); }, + get upload() { + return require('./upload'); + }, + get cacheControl() { return require('./cache-control'); }, diff --git a/core/server/web/shared/middlewares/upload.js b/core/server/web/shared/middlewares/upload.js new file mode 100644 index 0000000000..9c6d575d3e --- /dev/null +++ b/core/server/web/shared/middlewares/upload.js @@ -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};