add resize image based on url
This commit is contained in:
+43
-16
@@ -1,43 +1,53 @@
|
||||
const sharp = require('sharp');
|
||||
const fs = require('fs');
|
||||
const sharp = require("sharp");
|
||||
const fs = require("fs");
|
||||
const axios = require("axios");
|
||||
|
||||
const resizer = async (req, res) => {
|
||||
const { width, height, quality, format } = req.query;
|
||||
const { filename } = req.params;
|
||||
|
||||
const imageUrl = req.url.startsWith("/image/resize/")
|
||||
? req.url.slice(14)
|
||||
: "";
|
||||
|
||||
try {
|
||||
let bufferImage;
|
||||
if (imageUrl) {
|
||||
bufferImage = await imageUrlToBuffer(imageUrl);
|
||||
}
|
||||
|
||||
if (width) {
|
||||
if (parseInt(width) > 5000) {
|
||||
fs.unlinkSync('public/' + filename);
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: 'Error. Width must be <=5000',
|
||||
message: "Error. Width must be <=5000",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (height) {
|
||||
if (parseInt(height) > 5000) {
|
||||
fs.unlinkSync('public/' + filename);
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: 'Error. Height must be <=5000',
|
||||
message: "Error. Height must be <=5000",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (quality) {
|
||||
if (parseInt(quality) > 100) {
|
||||
fs.unlinkSync('public/' + filename);
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: 'Error. Quality must be <=100',
|
||||
message: "Error. Quality must be <=100",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const image = sharp(`./public/${filename}`);
|
||||
const image = sharp(bufferImage || `./public/${filename}`);
|
||||
let formatImage = (await image.metadata()).format;
|
||||
formatImage = format || formatImage === 'svg' ? 'png' : formatImage;
|
||||
|
||||
formatImage =
|
||||
format === "svg" || formatImage === "svg" ? "png" : format || formatImage;
|
||||
const widthImage = width ? parseInt(width) : (await image.metadata()).width;
|
||||
const heightImage = height
|
||||
? parseInt(height)
|
||||
@@ -51,18 +61,35 @@ const resizer = async (req, res) => {
|
||||
.withMetadata()
|
||||
.toBuffer();
|
||||
|
||||
res.setHeader('content-type', 'image');
|
||||
res.setHeader("content-type", "image");
|
||||
res.send(resizedImage);
|
||||
|
||||
fs.unlinkSync('public/' + filename);
|
||||
} catch (error) {
|
||||
fs.unlinkSync('public/' + filename);
|
||||
res.setHeader('content-type', 'application/json');
|
||||
res.setHeader("content-type", "application/json");
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Internal server error',
|
||||
message: error?.message || "Internal server error",
|
||||
});
|
||||
} finally {
|
||||
if (filename) {
|
||||
fs.unlinkSync("public/" + filename);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
async function imageUrlToBuffer(imageUrl) {
|
||||
try {
|
||||
const response = await axios.get(imageUrl, { responseType: "arraybuffer" });
|
||||
|
||||
if (response.status !== 200) {
|
||||
throw new Error(`HTTP error! Status: ${response.status}`);
|
||||
}
|
||||
|
||||
const buffer = Buffer.from(response.data);
|
||||
|
||||
return buffer;
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = resizer;
|
||||
|
||||
Reference in New Issue
Block a user