diff --git a/demo/payload.config.json b/demo/payload.config.json index 2035dfd454..e37a3fa8ab 100644 --- a/demo/payload.config.json +++ b/demo/payload.config.json @@ -24,5 +24,19 @@ "defaultLanguage": "en" }, "staticUrl": "/uploads", - "staticDir": "demo/uploads" + "staticDir": "demo/uploads", + "imageSizes": [ + { + "name": "tablet", + "width": 640, + "height": 480, + "crop": "left top" + }, + { + "name": "mobile", + "width": 320, + "height": 240, + "crop": "left top" + } + ] } diff --git a/package.json b/package.json index e17416059a..ca2b7fcfa9 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "file-loader": "^1.1.11", "http-status": "^1.2.0", "ignore-styles": "^5.0.1", + "image-size": "^0.7.1", "joi": "^13.6.0", "jsonwebtoken": "^8.4.0", "method-override": "^3.0.0", diff --git a/src/controllers/uploads.controller.js b/src/controllers/uploads.controller.js index 432449e831..8abd0e1159 100644 --- a/src/controllers/uploads.controller.js +++ b/src/controllers/uploads.controller.js @@ -1,12 +1,6 @@ import mkdirp from 'mkdirp'; +import { resize } from '../../src/utils/imageResizer'; -const classifyFile = (file) => { - console.log(`File mimetype: ${file.mimetype}`); - if (file.mimetype.split('/')[0] === 'image') { - // TODO: Perform image specific operations - console.log('File classified as an image.'); - } -}; function upload(req, res, next, config) { if (Object.keys(req.files).length === 0) { @@ -20,10 +14,13 @@ function upload(req, res, next, config) { } }); - req.files.file.mv(`${config.staticDir}/${req.files.file.name}`, (err) => { + let outputFilepath = `${config.staticDir}/${req.files.file.name}`; + req.files.file.mv(outputFilepath, (err) => { if (err) return res.status(500).send(err); - classifyFile(req.files.file); + if (req.files.file.mimetype.split('/')[0] === 'image') { + resize(config, req.files.file); + } res.send('File uploaded.'); }) } diff --git a/src/utils/imageResizer.js b/src/utils/imageResizer.js new file mode 100644 index 0000000000..c0110a7a34 --- /dev/null +++ b/src/utils/imageResizer.js @@ -0,0 +1,31 @@ +import sharp from 'sharp'; +import sizeOf from 'image-size'; + +function getOutputImageName(sourceImage, size) { + let extension = sourceImage.split('.').pop(); + let filenameWithoutExtension = sourceImage.substr(0, sourceImage.lastIndexOf('.')) || sourceImage; + return `${filenameWithoutExtension}-${size.name}.${extension}`; +} + +export function resize(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}`); + continue; + } + let outputImage = getOutputImageName(sourceImage, size); + sharp(sourceImage) + .resize(size.width, size.height, { + position: size.crop || 'centre' + }) + .toFile(outputImage, (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}`); + }); + + } + }); +}