Files
tally-counter/app/api/upload/route.ts
T
2026-06-06 17:14:53 +02:00

38 lines
1.1 KiB
TypeScript

import { NextResponse } from 'next/server';
import path from 'path';
import { writeFile } from 'fs/promises';
import { randomUUID } from 'crypto';
import { UPLOADS_DIR } from '@/lib/db';
export const dynamic = 'force-dynamic';
const ALLOWED_TYPES: Record<string, string> = {
'image/jpeg': 'jpg',
'image/png': 'png',
'image/gif': 'gif',
'image/webp': 'webp',
};
const MAX_SIZE_BYTES = 10 * 1024 * 1024; // 10 MB
export async function POST(request: Request) {
const formData = await request.formData();
const file = formData.get('file');
if (!file || !(file instanceof File)) {
return NextResponse.json({ error: 'No file provided' }, { status: 400 });
}
if (!ALLOWED_TYPES[file.type]) {
return NextResponse.json({ error: 'Invalid file type' }, { status: 400 });
}
if (file.size > MAX_SIZE_BYTES) {
return NextResponse.json({ error: 'File too large (max 10 MB)' }, { status: 400 });
}
const ext = ALLOWED_TYPES[file.type];
const filename = `${randomUUID()}.${ext}`;
const buffer = Buffer.from(await file.arrayBuffer());
await writeFile(path.join(UPLOADS_DIR, filename), buffer);
return NextResponse.json({ filename });
}