46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { auth } from "@/app/(auth)/auth";
|
|
import { uploadFile } from "@/lib/storage/service";
|
|
import {
|
|
DIRECTOR_MAX_GLB_BYTES,
|
|
validateDirectorGlb,
|
|
} from "@/lib/video-canvas/director-glb";
|
|
export const runtime = "nodejs";
|
|
export async function POST(request: Request) {
|
|
const session = await auth();
|
|
if (!session?.user?.id)
|
|
return NextResponse.json({ error: "未登录" }, { status: 401 });
|
|
try {
|
|
const form = await request.formData();
|
|
const file = form.get("file");
|
|
if (
|
|
!(file instanceof File) ||
|
|
!/\.glb$/i.test(file.name) ||
|
|
file.size > DIRECTOR_MAX_GLB_BYTES
|
|
)
|
|
return NextResponse.json(
|
|
{ error: "请上传 25 MiB 以内的 GLB 模型" },
|
|
{ status: 400 },
|
|
);
|
|
const buffer = await file.arrayBuffer();
|
|
try {
|
|
validateDirectorGlb(buffer);
|
|
} catch (error) {
|
|
return NextResponse.json(
|
|
{ error: error instanceof Error ? error.message : "无效 GLB" },
|
|
{ status: 400 },
|
|
);
|
|
}
|
|
const result = await uploadFile(
|
|
`director-${crypto.randomUUID()}.glb`,
|
|
buffer,
|
|
);
|
|
return NextResponse.json({ success: true, data: result });
|
|
} catch {
|
|
return NextResponse.json(
|
|
{ error: "模型上传失败,请重试" },
|
|
{ status: 500 },
|
|
);
|
|
}
|
|
}
|