From c69ac511f4999f0f3adcf3ad5fd89d8949b7ae68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20No=C3=ABl?= Date: Thu, 16 Jun 2022 17:38:14 +0100 Subject: [PATCH] Save dimensions for svg and gif images --- .../server/services/image-manipulation.js | 20 +++++- .../core/upload/server/services/upload.js | 66 ++++++++++--------- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/packages/core/upload/server/services/image-manipulation.js b/packages/core/upload/server/services/image-manipulation.js index dc0ae5c33b..ff460fa99b 100644 --- a/packages/core/upload/server/services/image-manipulation.js +++ b/packages/core/upload/server/services/image-manipulation.js @@ -9,7 +9,8 @@ const sharp = require('sharp'); const { getService } = require('../utils'); const { bytesToKbytes } = require('../utils/file'); -const FORMATS_TO_PROCESS = ['jpeg', 'png', 'webp', 'tiff']; +const FORMATS_TO_PROCESS = ['jpeg', 'png', 'webp', 'tiff', 'svg', 'gif']; +const FORMATS_TO_OPTIMIZE = ['jpeg', 'png', 'webp', 'tiff']; const writeStreamToFile = (stream, path) => new Promise((resolve, reject) => { @@ -159,7 +160,19 @@ const breakpointSmallerThan = (breakpoint, { width, height }) => { return breakpoint < width || breakpoint < height; }; -const isSupportedImage = async file => { +const isOptimizableImage = async file => { + let format; + try { + const metadata = await getMetadata(file); + format = metadata.format; + } catch (e) { + // throw when the file is not a supported image + return false; + } + return format && FORMATS_TO_OPTIMIZE.includes(format); +}; + +const isImage = async file => { let format; try { const metadata = await getMetadata(file); @@ -172,7 +185,8 @@ const isSupportedImage = async file => { }; module.exports = () => ({ - isSupportedImage, + isOptimizableImage, + isImage, getDimensions, generateResponsiveFormats, generateThumbnail, diff --git a/packages/core/upload/server/services/upload.js b/packages/core/upload/server/services/upload.js index 0ffdfcbdf4..3fd25e8677 100644 --- a/packages/core/upload/server/services/upload.js +++ b/packages/core/upload/server/services/upload.js @@ -117,9 +117,9 @@ module.exports = ({ strapi }) => ({ ); currentFile.getStream = () => fs.createReadStream(file.path); - const { optimize, isSupportedImage } = strapi.plugin('upload').service('image-manipulation'); + const { optimize, isOptimizableImage } = strapi.plugin('upload').service('image-manipulation'); - if (!(await isSupportedImage(currentFile))) { + if (!(await isOptimizableImage(currentFile))) { return currentFile; } @@ -162,27 +162,30 @@ module.exports = ({ strapi }) => ({ getDimensions, generateThumbnail, generateResponsiveFormats, - isSupportedImage, + isImage, + isOptimizableImage, } = getService('image-manipulation'); await getService('provider').upload(fileData); - if (await isSupportedImage(fileData)) { - const thumbnailFile = await generateThumbnail(fileData); - if (thumbnailFile) { - await getService('provider').upload(thumbnailFile); - _.set(fileData, 'formats.thumbnail', thumbnailFile); - } + 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 formats = await generateResponsiveFormats(fileData); + if (Array.isArray(formats) && formats.length > 0) { + for (const format of formats) { + if (!format) continue; - const { key, file } = format; + const { key, file } = format; - await getService('provider').upload(file); + await getService('provider').upload(file); - _.set(fileData, ['formats', key], file); + _.set(fileData, ['formats', key], file); + } } } @@ -193,6 +196,7 @@ module.exports = ({ strapi }) => ({ height, }); } + _.set(fileData, 'provider', config.provider); return this.add(fileData, { user }); @@ -260,25 +264,27 @@ module.exports = ({ strapi }) => ({ // clear old formats _.set(fileData, 'formats', {}); - const { isSupportedImage } = getService('image-manipulation'); + const { isImage, isOptimizableImage } = getService('image-manipulation'); - if (await isSupportedImage(fileData)) { - const thumbnailFile = await generateThumbnail(fileData); - if (thumbnailFile) { - await getService('provider').upload(thumbnailFile); - _.set(fileData, 'formats.thumbnail', thumbnailFile); - } + 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 formats = await generateResponsiveFormats(fileData); + if (Array.isArray(formats) && formats.length > 0) { + for (const format of formats) { + if (!format) continue; - const { key, file } = format; + const { key, file } = format; - await getService('provider').upload(file); + await getService('provider').upload(file); - _.set(fileData, ['formats', key], file); + _.set(fileData, ['formats', key], file); + } } }