62 lines
1.8 KiB
TypeScript
62 lines
1.8 KiB
TypeScript
import fs from "fs/promises";
|
|
import path from "path";
|
|
import sharp from "sharp";
|
|
|
|
async function img({
|
|
name,
|
|
UPLOAD_DIR_IMAGE,
|
|
ROOT,
|
|
size,
|
|
}: {
|
|
name: string;
|
|
UPLOAD_DIR_IMAGE: string;
|
|
ROOT: string;
|
|
size?: number; // Ukuran opsional (tidak ada default)
|
|
}) {
|
|
const completeName = path.basename(name); // Nama file lengkap
|
|
const ext = path.extname(name).toLowerCase(); // Ekstensi file dalam huruf kecil
|
|
// const fileNameWithoutExt = path.basename(name, ext); // Nama file tanpa ekstensi
|
|
|
|
// Default image jika terjadi kesalahan
|
|
const noImage = path.join(ROOT, "public/no-image.jpg");
|
|
|
|
// Validasi ekstensi file
|
|
if (![".jpg", ".jpeg", ".png"].includes(ext)) {
|
|
console.warn(`Ekstensi file tidak didukung: ${ext}`);
|
|
return new Response(await fs.readFile(noImage), {
|
|
headers: { "Content-Type": "image/jpeg" },
|
|
});
|
|
}
|
|
|
|
try {
|
|
// Path ke file asli
|
|
const filePath = path.join(UPLOAD_DIR_IMAGE, completeName);
|
|
|
|
// Periksa apakah file ada
|
|
await fs.stat(filePath);
|
|
|
|
// Metadata gambar asli
|
|
const metadata = await sharp(filePath).metadata();
|
|
|
|
// Proses resize menggunakan sharp
|
|
const resizedImageBuffer = await sharp(filePath)
|
|
.resize(size || metadata.width) // Gunakan size jika diberikan, jika tidak gunakan width asli
|
|
.toBuffer();
|
|
|
|
return new Response(resizedImageBuffer, {
|
|
headers: {
|
|
"Cache-Control": "public, max-age=3600, stale-while-revalidate=600",
|
|
"Content-Type": "image/jpeg",
|
|
},
|
|
});
|
|
} catch (error) {
|
|
console.error(`Gagal memproses file: ${name}`, error);
|
|
// Jika file tidak ditemukan atau gagal diproses, kembalikan default image
|
|
return new Response(await fs.readFile(noImage), {
|
|
headers: { "Content-Type": "image/jpeg" },
|
|
});
|
|
}
|
|
}
|
|
|
|
export default img;
|