summaryrefslogtreecommitdiff
path: root/app/api/richtext
diff options
context:
space:
mode:
Diffstat (limited to 'app/api/richtext')
-rw-r--r--app/api/richtext/route.ts54
1 files changed, 54 insertions, 0 deletions
diff --git a/app/api/richtext/route.ts b/app/api/richtext/route.ts
new file mode 100644
index 00000000..3d050dc5
--- /dev/null
+++ b/app/api/richtext/route.ts
@@ -0,0 +1,54 @@
+import { NextRequest, NextResponse } from 'next/server';
+import { writeFile, mkdir } from 'fs/promises';
+import { join } from 'path';
+import { randomUUID } from 'crypto';
+
+export async function POST(req: NextRequest) {
+ try {
+ const formData = await req.formData();
+ const file = formData.get('file') as File;
+
+ console.log(file)
+
+ if (!file) {
+ return NextResponse.json({ error: '파일이 없습니다.' }, { status: 400 });
+ }
+
+ // 파일 확장자 검증
+ const allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
+ if (!allowedTypes.includes(file.type)) {
+ return NextResponse.json({ error: '지원하지 않는 파일 형식입니다.' }, { status: 400 });
+ }
+
+ // 파일 크기 제한 (5MB)
+ if (file.size > 5 * 1024 * 1024) {
+ return NextResponse.json({ error: '파일 크기는 5MB 이하여야 합니다.' }, { status: 400 });
+ }
+
+ // 업로드 디렉토리 생성
+ const uploadDir = join(process.cwd(), 'public', 'uploads', 'richtext');
+ await mkdir(uploadDir, { recursive: true });
+
+ // 고유한 파일명 생성
+ const fileExtension = file.name.split('.').pop();
+ const fileName = `${randomUUID()}.${fileExtension}`;
+ const filePath = join(uploadDir, fileName);
+
+ // 파일 저장
+ const arrayBuffer = await file.arrayBuffer();
+ await writeFile(filePath, new Uint8Array(arrayBuffer));
+
+ // 공개 URL 반환
+ const fileUrl = `/uploads/richtext/${fileName}`;
+
+ return NextResponse.json({
+ success: true,
+ url: fileUrl,
+ message: '이미지가 성공적으로 업로드되었습니다.'
+ });
+
+ } catch (error) {
+ console.error('파일 업로드 실패:', error);
+ return NextResponse.json({ error: '파일 업로드에 실패했습니다.' }, { status: 500 });
+ }
+} \ No newline at end of file