Save dimensions for svg and gif images

This commit is contained in:
Pierre Noël 2022-06-16 17:38:14 +01:00
parent 02768b6fff
commit c69ac511f4
2 changed files with 53 additions and 33 deletions

View File

@ -9,7 +9,8 @@ const sharp = require('sharp');
const { getService } = require('../utils'); const { getService } = require('../utils');
const { bytesToKbytes } = require('../utils/file'); 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) => const writeStreamToFile = (stream, path) =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
@ -159,7 +160,19 @@ const breakpointSmallerThan = (breakpoint, { width, height }) => {
return breakpoint < width || breakpoint < 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; let format;
try { try {
const metadata = await getMetadata(file); const metadata = await getMetadata(file);
@ -172,7 +185,8 @@ const isSupportedImage = async file => {
}; };
module.exports = () => ({ module.exports = () => ({
isSupportedImage, isOptimizableImage,
isImage,
getDimensions, getDimensions,
generateResponsiveFormats, generateResponsiveFormats,
generateThumbnail, generateThumbnail,

View File

@ -117,9 +117,9 @@ module.exports = ({ strapi }) => ({
); );
currentFile.getStream = () => fs.createReadStream(file.path); 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; return currentFile;
} }
@ -162,27 +162,30 @@ module.exports = ({ strapi }) => ({
getDimensions, getDimensions,
generateThumbnail, generateThumbnail,
generateResponsiveFormats, generateResponsiveFormats,
isSupportedImage, isImage,
isOptimizableImage,
} = getService('image-manipulation'); } = getService('image-manipulation');
await getService('provider').upload(fileData); await getService('provider').upload(fileData);
if (await isSupportedImage(fileData)) { if (await isImage(fileData)) {
const thumbnailFile = await generateThumbnail(fileData); if (await isOptimizableImage(fileData)) {
if (thumbnailFile) { const thumbnailFile = await generateThumbnail(fileData);
await getService('provider').upload(thumbnailFile); if (thumbnailFile) {
_.set(fileData, 'formats.thumbnail', thumbnailFile); await getService('provider').upload(thumbnailFile);
} _.set(fileData, 'formats.thumbnail', thumbnailFile);
}
const formats = await generateResponsiveFormats(fileData); const formats = await generateResponsiveFormats(fileData);
if (Array.isArray(formats) && formats.length > 0) { if (Array.isArray(formats) && formats.length > 0) {
for (const format of formats) { for (const format of formats) {
if (!format) continue; 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, height,
}); });
} }
_.set(fileData, 'provider', config.provider); _.set(fileData, 'provider', config.provider);
return this.add(fileData, { user }); return this.add(fileData, { user });
@ -260,25 +264,27 @@ module.exports = ({ strapi }) => ({
// clear old formats // clear old formats
_.set(fileData, 'formats', {}); _.set(fileData, 'formats', {});
const { isSupportedImage } = getService('image-manipulation'); const { isImage, isOptimizableImage } = getService('image-manipulation');
if (await isSupportedImage(fileData)) { if (await isImage(fileData)) {
const thumbnailFile = await generateThumbnail(fileData); if (await isOptimizableImage(fileData)) {
if (thumbnailFile) { const thumbnailFile = await generateThumbnail(fileData);
await getService('provider').upload(thumbnailFile); if (thumbnailFile) {
_.set(fileData, 'formats.thumbnail', thumbnailFile); await getService('provider').upload(thumbnailFile);
} _.set(fileData, 'formats.thumbnail', thumbnailFile);
}
const formats = await generateResponsiveFormats(fileData); const formats = await generateResponsiveFormats(fileData);
if (Array.isArray(formats) && formats.length > 0) { if (Array.isArray(formats) && formats.length > 0) {
for (const format of formats) { for (const format of formats) {
if (!format) continue; 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);
}
} }
} }