Files
simple-image-resizer/helper/resizer.js
T

96 lines
2.3 KiB
JavaScript

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) {
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(bufferImage || `./public/${filename}`);
let formatImage = (await image.metadata()).format;
formatImage =
format === "svg" || formatImage === "svg" ? "png" : format || 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);
} catch (error) {
res.setHeader("content-type", "application/json");
res.status(500).json({
success: false,
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;