commit 77615015453331ca351ebb4264a15323c612538b Author: solehudin5699 Date: Sun Feb 27 22:27:22 2022 +0700 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..572406b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/node_modules +package-lock.json \ No newline at end of file diff --git a/helper/logger.js b/helper/logger.js new file mode 100644 index 0000000..b9fc808 --- /dev/null +++ b/helper/logger.js @@ -0,0 +1,14 @@ +const logger = (req, res, next) => { + const time = new Date().toUTCString(); + console.log( + `---------------------------------------------------------------\n${time}`, + JSON.stringify({ + method: req.method, + path: req.path, + ...req.headers, + }) + ); + next(); +}; + +module.exports = logger; diff --git a/helper/middleware.js b/helper/middleware.js new file mode 100644 index 0000000..9bd1d8a --- /dev/null +++ b/helper/middleware.js @@ -0,0 +1,45 @@ +const multer = require('multer'); +const path = require('path'); + +//Disk for save file +const storage = multer.diskStorage({ + destination: (req, res, cb) => { + cb(null, './public'); + }, + filename: (req, file, cb) => { + const nameFormat = `${Date.now()}-${file.fieldname}${path.extname( + file.originalname + )}`; + cb(null, nameFormat); + }, +}); + +//Limit filesize +const limits = { + fileSize: 10_1000_1000, +}; + +const upload = multer({ + storage, + limits, +}); + +const uploadMiddleware = (req, res, next) => { + const singleUpload = upload.single('image'); + singleUpload(req, res, (err) => { + if (err) { + res.json({ + success: false, + error: err, + }); + } else if (!req.file) { + res.json({ + success: false, + error: 'File not found', + }); + } else { + next(); + } + }); +}; +module.exports = uploadMiddleware; diff --git a/helper/resizer.js b/helper/resizer.js new file mode 100644 index 0000000..af4c304 --- /dev/null +++ b/helper/resizer.js @@ -0,0 +1,65 @@ +const sharp = require('sharp'); +const fs = require('fs'); + +const resizer = async (req, res) => { + try { + const { width, height, quality, format } = req.query; + const { filename } = req.params; + + if (width) { + if (parseInt(width) > 5000) { + return res.status(400).json({ + success: false, + message: 'Error. Width must be <=5000', + }); + } + } + + if (height) { + if (parseInt(height) > 5000) { + return res.status(400).json({ + success: false, + message: 'Error. Height must be <=5000', + }); + } + } + + if (quality) { + if (parseInt(quality) > 100) { + return res.status(400).json({ + success: false, + message: 'Error. Quality must be <=100', + }); + } + } + + const image = sharp(`./public/${filename}`); + let formatImage = (await image.metadata()).format; + formatImage = format || formatImage === 'svg' ? 'png' : formatImage; + const widthImage = width ? parseInt(width) : (await image.metadata()).width; + const heightImage = height + ? parseInt(height) + : (await image.metadata()).height; + + const resizedImage = await image + .resize(widthImage, heightImage) + .toFormat(formatImage, { + quality: quality ? parseInt(quality) : 100, + }) + .withMetadata() + .toBuffer(); + + res.setHeader('content-type', 'image'); + res.send(resizedImage); + + fs.unlinkSync('public/' + filename); + } catch (error) { + res.setHeader('content-type', 'application/json'); + res.status(500).json({ + success: false, + message: 'Internal server error', + }); + } +}; + +module.exports = resizer; diff --git a/index.js b/index.js new file mode 100644 index 0000000..af07738 --- /dev/null +++ b/index.js @@ -0,0 +1,30 @@ +const express = require('express'); +const path = require('path'); +const bodyParser = require('body-parser'); +const resizer = require('./helper/resizer'); +const uploadMiddleware = require('./helper/middleware'); +const logger = require('./helper/logger'); + +const PORT = process.env.PORT || 5000; +const app = express(); + +app.use(logger); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(express.static('public')); + +app.get('/', async (req, res) => { + res.sendFile(path.join(__dirname, './public/index.html')); +}); +app.get('/public/:filename', resizer); +app.post('/', uploadMiddleware, (req, res) => { + res.json({ + success: true, + message: 'Success upload file', + urlImage: `http://localhost:5000/public/${req.file.filename}`, + }); +}); + +app.listen(PORT, () => { + console.log(`Server running on port ${PORT}`); +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..86bc250 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "simple-image-resizer", + "version": "1.0.0", + "description": "resize image file", + "main": "index.js", + "scripts": { + "start": "node index.js" + }, + "author": "", + "license": "ISC", + "dependencies": { + "body-parser": "^1.19.2", + "express": "^4.17.3", + "multer": "^1.4.4", + "sharp": "^0.28.3" + }, + "engines": { + "node": "14.x" + } +} diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..4e0ddd7 --- /dev/null +++ b/public/index.html @@ -0,0 +1,276 @@ + + + + + + + Resize Image + + + +
+
Browse Image
+ + +
+
+ + + +
+
+ + +
+
+ + +
+ +
+ + +
+
+ + +
+ + + +