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,11 +162,13 @@ 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)) {
if (await isOptimizableImage(fileData)) {
const thumbnailFile = await generateThumbnail(fileData); const thumbnailFile = await generateThumbnail(fileData);
if (thumbnailFile) { if (thumbnailFile) {
await getService('provider').upload(thumbnailFile); await getService('provider').upload(thumbnailFile);
@ -185,6 +187,7 @@ module.exports = ({ strapi }) => ({
_.set(fileData, ['formats', key], file); _.set(fileData, ['formats', key], file);
} }
} }
}
const { width, height } = await getDimensions(fileData); const { width, height } = await getDimensions(fileData);
@ -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,9 +264,10 @@ 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)) {
if (await isOptimizableImage(fileData)) {
const thumbnailFile = await generateThumbnail(fileData); const thumbnailFile = await generateThumbnail(fileData);
if (thumbnailFile) { if (thumbnailFile) {
await getService('provider').upload(thumbnailFile); await getService('provider').upload(thumbnailFile);
@ -281,6 +286,7 @@ module.exports = ({ strapi }) => ({
_.set(fileData, ['formats', key], file); _.set(fileData, ['formats', key], file);
} }
} }
}
const { width, height } = await getDimensions(fileData); const { width, height } = await getDimensions(fileData);