tambahannya
This commit is contained in:
20
src/app/api/[[...slugs]]/_lib/img-del.ts
Normal file
20
src/app/api/[[...slugs]]/_lib/img-del.ts
Normal 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;
|
||||
61
src/app/api/[[...slugs]]/_lib/img.ts
Normal file
61
src/app/api/[[...slugs]]/_lib/img.ts
Normal 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;
|
||||
30
src/app/api/[[...slugs]]/_lib/imgs.ts
Normal file
30
src/app/api/[[...slugs]]/_lib/imgs.ts
Normal 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;
|
||||
12
src/app/api/[[...slugs]]/_lib/upl-csv-single.ts
Normal file
12
src/app/api/[[...slugs]]/_lib/upl-csv-single.ts
Normal 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";
|
||||
}
|
||||
16
src/app/api/[[...slugs]]/_lib/upl-csv.ts
Normal file
16
src/app/api/[[...slugs]]/_lib/upl-csv.ts
Normal 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;
|
||||
32
src/app/api/[[...slugs]]/_lib/upl-img-single.ts
Normal file
32
src/app/api/[[...slugs]]/_lib/upl-img-single.ts
Normal 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";
|
||||
}
|
||||
}
|
||||
52
src/app/api/[[...slugs]]/_lib/upl-img.ts
Normal file
52
src/app/api/[[...slugs]]/_lib/upl-img.ts
Normal 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;
|
||||
Reference in New Issue
Block a user