diff --git a/install/data/defaults.json b/install/data/defaults.json index a5921ab940..8b6f7a2b03 100644 --- a/install/data/defaults.json +++ b/install/data/defaults.json @@ -52,6 +52,7 @@ "orphanExpiryDays": 0, "resizeImageWidthThreshold": 2000, "resizeImageWidth": 760, + "resizeImageKeepOriginal": 1, "rejectImageWidth": 5000, "rejectImageHeight": 5000, "resizeImageQuality": 80, diff --git a/public/language/en-GB/admin/settings/uploads.json b/public/language/en-GB/admin/settings/uploads.json index f99528e4d0..22046915d9 100644 --- a/public/language/en-GB/admin/settings/uploads.json +++ b/public/language/en-GB/admin/settings/uploads.json @@ -12,6 +12,7 @@ "resize-image-width-threshold-help": "(in pixels, default: 2000 pixels, set to 0 to disable)", "resize-image-width": "Resize images down to specified width", "resize-image-width-help": "(in pixels, default: 760 pixels, set to 0 to disable)", + "resize-image-keep-original": "Keep original image after resize", "resize-image-quality": "Quality to use when resizing images", "resize-image-quality-help": "Use a lower quality setting to reduce the file size of resized images.", "max-file-size": "Maximum File Size (in KiB)", diff --git a/src/controllers/uploads.js b/src/controllers/uploads.js index d5105d25f1..29b5fac332 100644 --- a/src/controllers/uploads.js +++ b/src/controllers/uploads.js @@ -110,12 +110,16 @@ async function resizeImage(fileObj) { await image.resizeImage({ path: fileObj.path, - target: file.appendToFileName(fileObj.path, '-resized'), + target: meta.config.resizeImageKeepOriginal ? + file.appendToFileName(fileObj.path, '-resized') : + fileObj.path, width: meta.config.resizeImageWidth, quality: meta.config.resizeImageQuality, }); // Return the resized version to the composer/postData - fileObj.url = file.appendToFileName(fileObj.url, '-resized'); + if (meta.config.resizeImageKeepOriginal) { + fileObj.url = file.appendToFileName(fileObj.url, '-resized'); + } return fileObj; } diff --git a/src/image.js b/src/image.js index 4f07267f16..6c0ae9e68a 100644 --- a/src/image.js +++ b/src/image.js @@ -122,7 +122,6 @@ image.stripEXIF = async function (path) { }; image.checkDimensions = async function (path) { - const meta = require('./meta'); const result = await image.size(path); if (result.width > meta.config.rejectImageWidth || result.height > meta.config.rejectImageHeight) { diff --git a/src/upgrades/3.12.0/resize-image-keep-original.js b/src/upgrades/3.12.0/resize-image-keep-original.js new file mode 100644 index 0000000000..92f889fd2c --- /dev/null +++ b/src/upgrades/3.12.0/resize-image-keep-original.js @@ -0,0 +1,13 @@ +/* eslint-disable no-await-in-loop */ + +'use strict'; + +const db = require('../../database'); + +module.exports = { + name: 'Add setting for keeping original image after resize', + timestamp: Date.UTC(2024, 11, 2), + method: async function () { + await db.setObjectField('config', 'resizeImageKeepOriginal', 1); + }, +}; diff --git a/src/views/admin/settings/uploads.tpl b/src/views/admin/settings/uploads.tpl index 58da4e3ff6..aa138c8c67 100644 --- a/src/views/admin/settings/uploads.tpl +++ b/src/views/admin/settings/uploads.tpl @@ -46,6 +46,11 @@ +
+ + +
+
diff --git a/test/uploads.js b/test/uploads.js index ff59c4c1f2..a8e48afac5 100644 --- a/test/uploads.js +++ b/test/uploads.js @@ -164,6 +164,24 @@ describe('Upload Controllers', () => { meta.config.resizeImageWidthThreshold = 2000; }); + it('should resize and upload an image to a post and replace original', async () => { + const oldValue = meta.config.resizeImageWidth; + const keepOldValue = meta.config.resizeImageKeepOriginal; + meta.config.resizeImageWidth = 10; + meta.config.resizeImageWidthThreshold = 10; + meta.config.resizeImageKeepOriginal = 0; + const { response, body } = await helpers.uploadFile(`${nconf.get('url')}/api/post/upload`, path.join(__dirname, '../test/files/test.png'), {}, jar, csrf_token); + + assert.equal(response.statusCode, 200); + assert(body && body.status && body.response && body.response.images); + assert(Array.isArray(body.response.images)); + assert(body.response.images[0].url); + assert(body.response.images[0].url.match(/\/assets\/uploads\/files\/\d+-test.png/)); + meta.config.resizeImageWidth = oldValue; + meta.config.resizeImageWidthThreshold = 2000; + meta.config.resizeImageKeepOriginal = keepOldValue; + }); + it('should upload a file to a post', async () => { const oldValue = meta.config.allowedFileExtensions; meta.config.allowedFileExtensions = 'png,jpg,bmp,html';