From 47a4486943fd85afcd09b11da40225e81a12f0f8 Mon Sep 17 00:00:00 2001 From: Marc Date: Sat, 30 Jul 2022 10:14:37 +0200 Subject: [PATCH 1/4] do not override width and height --- .../core/upload/server/services/upload.js | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 6849e47c75..7a9b11370e 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -30,13 +30,13 @@ const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constan const randomSuffix = () => crypto.randomBytes(5).toString('hex'); -const generateFileName = name => { +const generateFileName = (name) => { const baseName = nameToSlug(name, { separator: '_', lowercase: false }); return `${baseName}_${randomSuffix()}`; }; -const sendMediaMetrics = data => { +const sendMediaMetrics = (data) => { if (_.has(data, 'caption') && !_.isEmpty(data.caption)) { strapi.telemetry.send('didSaveMediaWithCaption'); } @@ -46,11 +46,11 @@ const sendMediaMetrics = data => { } }; -const createAndAssignTmpWorkingDirectoryToFiles = async files => { +const createAndAssignTmpWorkingDirectoryToFiles = async (files) => { const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-')); Array.isArray(files) - ? files.forEach(file => (file.tmpWorkingDirectory = tmpWorkingDirectory)) + ? files.forEach((file) => (file.tmpWorkingDirectory = tmpWorkingDirectory)) : (files.tmpWorkingDirectory = tmpWorkingDirectory); return tmpWorkingDirectory; @@ -159,6 +159,10 @@ module.exports = ({ strapi }) => ({ return uploadedFiles; }, + /** + * Upload a file. If it is an image it will generate a thumbnail + * and responsive formats (if enabled). + */ async uploadFileAndPersist(fileData, { user } = {}) { const config = strapi.config.get('plugin.upload'); @@ -169,9 +173,24 @@ module.exports = ({ strapi }) => ({ isImage, isOptimizableImage, } = getService('image-manipulation'); - await getService('provider').upload(fileData); - if (await isImage(fileData)) { + const isFileAnImage = await isImage(fileData); + + if (!isFileAnImage) { + // Upload directly if it is not an image + await getService('provider').upload(fileData); + } else { + // Store width and height of image + const { width, height } = await getDimensions(fileData); + + _.assign(fileData, { + width, + height, + }); + + await getService('provider').upload(fileData); + + // Generate thumbnail and responsive formats if (await isOptimizableImage(fileData)) { const thumbnailFile = await generateThumbnail(fileData); if (thumbnailFile) { @@ -192,17 +211,11 @@ module.exports = ({ strapi }) => ({ } } } - - const { width, height } = await getDimensions(fileData); - - _.assign(fileData, { - width, - height, - }); } _.set(fileData, 'provider', config.provider); + // Persist file(s) return this.add(fileData, { user }); }, @@ -230,9 +243,8 @@ module.exports = ({ strapi }) => ({ async replace(id, { data, file }, { user } = {}) { const config = strapi.config.get('plugin.upload'); - const { getDimensions, generateThumbnail, generateResponsiveFormats } = getService( - 'image-manipulation' - ); + const { getDimensions, generateThumbnail, generateResponsiveFormats } = + getService('image-manipulation'); const dbFile = await this.findOne(id); if (!dbFile) { @@ -260,7 +272,7 @@ module.exports = ({ strapi }) => ({ if (dbFile.formats) { await Promise.all( - Object.keys(dbFile.formats).map(key => { + Object.keys(dbFile.formats).map((key) => { return strapi.plugin('upload').provider.delete(dbFile.formats[key]); }) ); @@ -362,7 +374,7 @@ module.exports = ({ strapi }) => ({ if (file.formats) { await Promise.all( - Object.keys(file.formats).map(key => { + Object.keys(file.formats).map((key) => { return strapi.plugin('upload').provider.delete(file.formats[key]); }) ); @@ -392,7 +404,7 @@ module.exports = ({ strapi }) => ({ try { const enhancedFiles = await Promise.all( - arr.map(file => { + arr.map((file) => { return this.enhanceFile( file, { folder: apiUploadFolder.id }, @@ -405,7 +417,7 @@ module.exports = ({ strapi }) => ({ }) ); - await Promise.all(enhancedFiles.map(file => this.uploadFileAndPersist(file))); + await Promise.all(enhancedFiles.map((file) => this.uploadFileAndPersist(file))); } finally { // delete temporary folder await fse.remove(tmpWorkingDirectory); From f0b67b9ec5493d07b39cb4127215a0299bdee101 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 1 Aug 2022 12:14:13 +0200 Subject: [PATCH 2/4] add function for uploading image --- .../core/upload/server/services/upload.js | 147 ++++++++---------- 1 file changed, 64 insertions(+), 83 deletions(-) diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 7a9b11370e..469cee1ef1 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -30,13 +30,13 @@ const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constan const randomSuffix = () => crypto.randomBytes(5).toString('hex'); -const generateFileName = (name) => { +const generateFileName = name => { const baseName = nameToSlug(name, { separator: '_', lowercase: false }); return `${baseName}_${randomSuffix()}`; }; -const sendMediaMetrics = (data) => { +const sendMediaMetrics = data => { if (_.has(data, 'caption') && !_.isEmpty(data.caption)) { strapi.telemetry.send('didSaveMediaWithCaption'); } @@ -46,11 +46,11 @@ const sendMediaMetrics = (data) => { } }; -const createAndAssignTmpWorkingDirectoryToFiles = async (files) => { +const createAndAssignTmpWorkingDirectoryToFiles = async files => { const tmpWorkingDirectory = await fse.mkdtemp(path.join(os.tmpdir(), 'strapi-upload-')); Array.isArray(files) - ? files.forEach((file) => (file.tmpWorkingDirectory = tmpWorkingDirectory)) + ? files.forEach(file => (file.tmpWorkingDirectory = tmpWorkingDirectory)) : (files.tmpWorkingDirectory = tmpWorkingDirectory); return tmpWorkingDirectory; @@ -159,6 +159,54 @@ module.exports = ({ strapi }) => ({ return uploadedFiles; }, + /** + * When uploading an image, an additional thubmnail is generated. + * Also, if there are responsive formats defined, another set of images will be generated too. + * + * @param {*} fileData + */ + async uploadImage(fileData) { + const { + getDimensions, + generateThumbnail, + generateResponsiveFormats, + isOptimizableImage, + } = getService('image-manipulation'); + + // Store width and height of the original image + const { width, height } = await getDimensions(fileData); + + _.assign(fileData, { + width, + height, + }); + + // Upload image + await getService('provider').upload(fileData); + + // Generate thumbnail and responsive formats + if (await isOptimizableImage(fileData)) { + const thumbnailFile = await generateThumbnail(fileData); + if (thumbnailFile) { + await getService('provider').upload(thumbnailFile); + _.set(fileData, 'formats.thumbnail', thumbnailFile); + } + + const formats = await generateResponsiveFormats(fileData); + if (Array.isArray(formats) && formats.length > 0) { + for (const format of formats) { + if (!format) continue; + + const { key, file } = format; + + await getService('provider').upload(file); + + _.set(fileData, ['formats', key], file); + } + } + } + }, + /** * Upload a file. If it is an image it will generate a thumbnail * and responsive formats (if enabled). @@ -166,51 +214,12 @@ module.exports = ({ strapi }) => ({ async uploadFileAndPersist(fileData, { user } = {}) { const config = strapi.config.get('plugin.upload'); - const { - getDimensions, - generateThumbnail, - generateResponsiveFormats, - isImage, - isOptimizableImage, - } = getService('image-manipulation'); + const { isImage } = getService('image-manipulation'); - const isFileAnImage = await isImage(fileData); - - if (!isFileAnImage) { - // Upload directly if it is not an image - await getService('provider').upload(fileData); + if (await isImage(fileData)) { + await this.uploadImage(fileData); } else { - // Store width and height of image - const { width, height } = await getDimensions(fileData); - - _.assign(fileData, { - width, - height, - }); - await getService('provider').upload(fileData); - - // Generate thumbnail and responsive formats - if (await isOptimizableImage(fileData)) { - const thumbnailFile = await generateThumbnail(fileData); - if (thumbnailFile) { - await getService('provider').upload(thumbnailFile); - _.set(fileData, 'formats.thumbnail', thumbnailFile); - } - - const formats = await generateResponsiveFormats(fileData); - if (Array.isArray(formats) && formats.length > 0) { - for (const format of formats) { - if (!format) continue; - - const { key, file } = format; - - await getService('provider').upload(file); - - _.set(fileData, ['formats', key], file); - } - } - } } _.set(fileData, 'provider', config.provider); @@ -243,8 +252,7 @@ module.exports = ({ strapi }) => ({ async replace(id, { data, file }, { user } = {}) { const config = strapi.config.get('plugin.upload'); - const { getDimensions, generateThumbnail, generateResponsiveFormats } = - getService('image-manipulation'); + const { isImage } = getService('image-manipulation'); const dbFile = await this.findOne(id); if (!dbFile) { @@ -272,49 +280,22 @@ module.exports = ({ strapi }) => ({ if (dbFile.formats) { await Promise.all( - Object.keys(dbFile.formats).map((key) => { + Object.keys(dbFile.formats).map(key => { return strapi.plugin('upload').provider.delete(dbFile.formats[key]); }) ); } } - await getService('provider').upload(fileData); - // clear old formats _.set(fileData, 'formats', {}); - const { isImage, isOptimizableImage } = getService('image-manipulation'); - if (await isImage(fileData)) { - if (await isOptimizableImage(fileData)) { - const thumbnailFile = await generateThumbnail(fileData); - if (thumbnailFile) { - await getService('provider').upload(thumbnailFile); - _.set(fileData, 'formats.thumbnail', thumbnailFile); - } - - const formats = await generateResponsiveFormats(fileData); - if (Array.isArray(formats) && formats.length > 0) { - for (const format of formats) { - if (!format) continue; - - const { key, file } = format; - - await getService('provider').upload(file); - - _.set(fileData, ['formats', key], file); - } - } - } - - const { width, height } = await getDimensions(fileData); - - _.assign(fileData, { - width, - height, - }); + await this.uploadImage(fileData); + } else { + await getService('provider').upload(fileData); } + _.set(fileData, 'provider', config.provider); } finally { // delete temporary folder @@ -374,7 +355,7 @@ module.exports = ({ strapi }) => ({ if (file.formats) { await Promise.all( - Object.keys(file.formats).map((key) => { + Object.keys(file.formats).map(key => { return strapi.plugin('upload').provider.delete(file.formats[key]); }) ); @@ -404,7 +385,7 @@ module.exports = ({ strapi }) => ({ try { const enhancedFiles = await Promise.all( - arr.map((file) => { + arr.map(file => { return this.enhanceFile( file, { folder: apiUploadFolder.id }, @@ -417,7 +398,7 @@ module.exports = ({ strapi }) => ({ }) ); - await Promise.all(enhancedFiles.map((file) => this.uploadFileAndPersist(file))); + await Promise.all(enhancedFiles.map(file => this.uploadFileAndPersist(file))); } finally { // delete temporary folder await fse.remove(tmpWorkingDirectory); From 09fdd984c11c187f026e58e2dba789d7a008ae03 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 1 Aug 2022 15:53:03 +0200 Subject: [PATCH 3/4] test upload image --- .../formatFileInfo.test.js} | 2 +- .../services/__tests__/upload/image.png | Bin 0 -> 6646 bytes .../__tests__/upload/uploadImage.test.js | 88 ++++++++++++++++++ .../core/upload/server/services/upload.js | 2 + 4 files changed, 91 insertions(+), 1 deletion(-) rename packages/core/upload/server/services/__tests__/{upload.test.js => upload/formatFileInfo.test.js} (98%) create mode 100644 packages/core/upload/server/services/__tests__/upload/image.png create mode 100644 packages/core/upload/server/services/__tests__/upload/uploadImage.test.js diff --git a/packages/core/upload/server/services/__tests__/upload.test.js b/packages/core/upload/server/services/__tests__/upload/formatFileInfo.test.js similarity index 98% rename from packages/core/upload/server/services/__tests__/upload.test.js rename to packages/core/upload/server/services/__tests__/upload/formatFileInfo.test.js index 0ebab147b5..884ae3bbf7 100644 --- a/packages/core/upload/server/services/__tests__/upload.test.js +++ b/packages/core/upload/server/services/__tests__/upload/formatFileInfo.test.js @@ -1,6 +1,6 @@ 'use strict'; -const uploadService = require('../upload')({}); +const uploadService = require('../../upload')({}); describe('Upload service', () => { beforeAll(() => { diff --git a/packages/core/upload/server/services/__tests__/upload/image.png b/packages/core/upload/server/services/__tests__/upload/image.png new file mode 100644 index 0000000000000000000000000000000000000000..3ec3f1189a739f68f3bf24cab90be09cd0196dbb GIT binary patch literal 6646 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 literal 0 HcmV?d00001 diff --git a/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js b/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js new file mode 100644 index 0000000000..b0317919f8 --- /dev/null +++ b/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js @@ -0,0 +1,88 @@ +'use strict'; + +const path = require('path'); +const fs = require('fs'); +const fse = require('fs-extra'); +const _ = require('lodash'); +const uploadService = require('../../upload')({}); + +const testFilePath = path.join(__dirname, './image.png'); +const tmpWorkingDirectory = path.join(__dirname, './tmp'); + +function mockUploadProvider(uploadFunc, props) { + const { responsiveDimensions = false } = props || {}; + + const default_config = { + plugin: { + upload: { + breakpoints: { + large: 1000, + medium: 750, + }, + }, + }, + }; + + global.strapi = { + config: { + get: (path, defaultValue) => _.get(default_config, path, defaultValue), + }, + plugins: { + upload: { + services: { + provider: { + upload: uploadFunc, + }, + upload: { + getSettings: () => ({ responsiveDimensions }), + }, + 'image-manipulation': require('../../image-manipulation')(), + }, + }, + }, + }; +} + +const getFileData = () => ({ + alternativeText: 'image.png', + caption: 'image.png', + ext: '.png', + folder: null, + folderPath: '/', + getStream: () => fs.createReadStream(testFilePath), + hash: 'image_d9b4f84424', + height: 1000, + size: 4, + width: 1500, + tmpWorkingDirectory, +}); + +describe('Upload image', () => { + beforeAll(async () => { + // Create tmp directory if it does not exist + await fse.mkdir(tmpWorkingDirectory); + }); + + afterAll(async () => { + // Remove tmp directory + await fse.remove(tmpWorkingDirectory); + }); + test('Upload with thubmnail', async () => { + let fileData = getFileData(); + const upload = jest.fn(); + mockUploadProvider(upload); + + await uploadService.uploadImage(fileData); + expect(upload).toHaveBeenCalledTimes(2); + }); + + test('Upload with responsive formats', async () => { + let fileData = getFileData(); + const upload = jest.fn(); + mockUploadProvider(upload, { responsiveDimensions: true }); + + await uploadService.uploadImage(fileData); + // 1 for the original image, 1 for thubnhail, 2 for the responsive formats + expect(upload).toHaveBeenCalledTimes(4); + }); +}); diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 469cee1ef1..7c4b3b858c 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -176,6 +176,8 @@ module.exports = ({ strapi }) => ({ // Store width and height of the original image const { width, height } = await getDimensions(fileData); + // Make sure this is assigned before calling upload + // That way it can mutate the width and height _.assign(fileData, { width, height, From 237d12abf4938803e2c72b9123a5e94ad23c9c31 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 3 Aug 2022 09:39:52 +0200 Subject: [PATCH 4/4] typos --- .../server/services/__tests__/upload/uploadImage.test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js b/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js index b0317919f8..dd5406c55b 100644 --- a/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js +++ b/packages/core/upload/server/services/__tests__/upload/uploadImage.test.js @@ -67,6 +67,7 @@ describe('Upload image', () => { // Remove tmp directory await fse.remove(tmpWorkingDirectory); }); + test('Upload with thubmnail', async () => { let fileData = getFileData(); const upload = jest.fn(); @@ -82,7 +83,7 @@ describe('Upload image', () => { mockUploadProvider(upload, { responsiveDimensions: true }); await uploadService.uploadImage(fileData); - // 1 for the original image, 1 for thubnhail, 2 for the responsive formats + // 1 for the original image, 1 for thumbnail, 2 for the responsive formats expect(upload).toHaveBeenCalledTimes(4); }); });