tambahannya

This commit is contained in:
bipproduction
2025-02-19 17:41:56 +08:00
parent 0d4a8329d7
commit 9bde6a2a06
74 changed files with 1079 additions and 186 deletions

View File

@@ -0,0 +1,20 @@
import fs from "fs/promises";
import path from "path";
async function imgDel({
name,
UPLOAD_DIR_IMAGE,
}: {
name: string;
UPLOAD_DIR_IMAGE: string;
}) {
try {
await fs.unlink(path.join(UPLOAD_DIR_IMAGE, name));
return "ok";
} catch (error) {
console.log(error);
return "error";
}
}
export default imgDel;

View File

@@ -0,0 +1,61 @@
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;

View File

@@ -0,0 +1,30 @@
import fs from "fs/promises";
async function imgs({
search = "",
page = 1,
count = 20,
UPLOAD_DIR_IMAGE,
}: {
search?: string;
page?: number;
count?: number;
UPLOAD_DIR_IMAGE: string;
}) {
const files = await fs.readdir(UPLOAD_DIR_IMAGE);
return files
.filter(
(file) =>
file.endsWith(".jpg") || file.endsWith(".png") || file.endsWith(".jpeg")
)
.filter((file) => file.includes(search))
.slice((page - 1) * count, page * count)
.map((file) => ({
name: file,
url: `/api/img/${file}`,
total: files.length,
}));
}
export default imgs;

View File

@@ -0,0 +1,12 @@
export async function uplCsvSingle({
fileName,
file,
}: {
fileName: string;
file: File;
}) {
const textFile = await file.text();
console.log(fileName, textFile);
return "ok";
}

View File

@@ -0,0 +1,16 @@
async function uplCsv({ files }: { files: File[] }) {
if (!Array.isArray(files) || files.length === 0) {
throw new Error("Tidak ada file yang diunggah");
}
for (const file of files) {
const textFile = await file.text();
const fileName = file.name;
console.log(textFile, fileName);
}
return "ok";
}
export default uplCsv;

View File

@@ -0,0 +1,32 @@
import { nanoid } from "nanoid";
import fs from "fs/promises";
import path from "path";
import _ from "lodash";
export async function uplImgSingle({
fileName,
file,
UPLOAD_DIR_IMAGE,
}: {
fileName: string;
file: File;
UPLOAD_DIR_IMAGE: string;
}) {
if (!fileName || typeof fileName !== "string" || fileName.trim() === "") {
console.warn(`Nama file tidak valid: ${fileName}`);
fileName = nanoid() + ".jpg";
}
const ext = path.extname(fileName).toLowerCase();
const fileNameWithoutExt = path.basename(fileName, ext);
const fileNameKebabCase = _.kebabCase(fileNameWithoutExt) + ext;
try {
const buffer = Buffer.from(await file.arrayBuffer());
const filePath = path.join(UPLOAD_DIR_IMAGE, fileNameKebabCase);
await fs.writeFile(filePath, buffer);
return filePath;
} catch (error) {
console.log(error);
return "error";
}
}

View File

@@ -0,0 +1,52 @@
import path from "path";
import fs from "fs/promises";
import { nanoid } from "nanoid";
async function uplImg({
files,
UPLOAD_DIR_IMAGE,
}: {
files: File[];
UPLOAD_DIR_IMAGE: string;
}) {
// Validasi input
if (!Array.isArray(files) || files.length === 0) {
throw new Error("Tidak ada file yang diunggah");
}
for (const file of files) {
let fileName = file.name;
// Validasi nama file
if (!fileName || typeof fileName !== "string" || fileName.trim() === "") {
console.warn(`Nama file tidak valid: ${fileName}`);
fileName = nanoid() + ".jpg";
}
// Sanitasi nama file untuk mencegah path traversal
const sanitizedFileName = sanitizeFileName(fileName);
try {
// Konversi file ke buffer
const buffer = Buffer.from(await file.arrayBuffer());
// Tulis file ke direktori uploads
const filePath = path.join(UPLOAD_DIR_IMAGE, sanitizedFileName);
await fs.writeFile(filePath, buffer);
console.log(`File berhasil diunggah: ${sanitizedFileName}`);
} catch (error) {
console.error(`Gagal mengunggah file ${fileName}:`, error);
throw new Error(`Gagal mengunggah file: ${fileName}`);
}
}
return "ok";
}
// Fungsi untuk membersihkan nama file dari karakter yang tidak aman
function sanitizeFileName(fileName: string): string {
return fileName.replace(/[^a-zA-Z0-9._\-]/g, "_");
}
export default uplImg;