Populate output sizes in database

This commit is contained in:
Elliot DeNolf
2019-05-04 22:02:55 -04:00
parent 5e540ada42
commit 45cedb5060
3 changed files with 29 additions and 20 deletions

View File

@@ -19,7 +19,7 @@ export async function update(req, res, next, config) {
let outputFilepath = `${config.staticDir}/${req.files.file.name}`;
let moveError = await req.files.file.mv(outputFilepath);
if (moveError) return res.status(500).send(moveError);
resizeAndSave(config, req.files.file);
doc['sizes'] = await resizeAndSave(config, req.files.file);
}
doc.save((saveError) => {
@@ -48,13 +48,14 @@ export async function upload(req, res, next, config) {
let outputFilepath = `${config.staticDir}/${req.files.file.name}`;
let moveError = await req.files.file.mv(outputFilepath);
if (moveError) return res.status(500).send(moveError);
resizeAndSave(config, req.files.file);
let outputSizes = await resizeAndSave(config, req.files.file);
req.model.create({
name: req.body.name,
caption: req.body.caption,
description: req.body.description,
filename: req.files.file.name
filename: req.files.file.name,
sizes: outputSizes
}, (mediaCreateError, result) => {
if (mediaCreateError)
return res.status(500).json({ error: mediaCreateError });

View File

@@ -8,7 +8,12 @@ const mediaModelLoader = (config) => {
name: { type: String, intl: true },
caption: { type: String, intl: true },
description: { type: String, intl: true },
filename: { type: String }
filename: { type: String },
sizes: [{
height: { type: Number},
width: { type: Number},
_id: false
}]
},
{ timestamps: true }
);

View File

@@ -1,5 +1,6 @@
import sharp from 'sharp';
import sizeOf from 'image-size';
const { promisify } = require('util');
const sizeOf = promisify(require('image-size'));
function getOutputImageName(sourceImage, size) {
let extension = sourceImage.split('.').pop();
@@ -7,25 +8,27 @@ function getOutputImageName(sourceImage, size) {
return `${filenameWithoutExtension}-${size.width}x${size.height}.${extension}`;
}
export function resizeAndSave(config, file) {
export async function resizeAndSave(config, file) {
let sourceImage = `${config.staticDir}/${file.name}`;
sizeOf(sourceImage, (err, dimensions) => {
for (let size of config.imageSizes) {
if (size.width > dimensions.width) {
console.log(`${size.width} is greater than actual width ${dimensions.width}`);
let outputSizes = [];
try {
const dimensions = await sizeOf(sourceImage);
for (let desiredSize of config.imageSizes) {
if (desiredSize.width > dimensions.width) {
continue;
}
let outputImageName = getOutputImageName(sourceImage, size);
sharp(sourceImage)
.resize(size.width, size.height, {
position: size.crop || 'centre'
let outputImageName = getOutputImageName(sourceImage, desiredSize);
await sharp(sourceImage)
.resize(desiredSize.width, desiredSize.height, {
position: desiredSize.crop || 'centre'
})
.toFile(outputImageName, (err) => {
if (err) console.log('Error writing resized file', err);
console.log(`Resized image from ${dimensions.width}x${dimensions.height} to ${size.width}x${size.height}`);
});
.toFile(outputImageName);
outputSizes.push({ height: desiredSize.height, width: desiredSize.width });
}
});
} catch (e) {
console.log('error in resize and save', e.message);
}
return outputSizes;
}