chatbot-template/app/(chat)/api/files/upload/route.ts

70 lines
1.7 KiB
TypeScript
Raw Normal View History

2024-10-11 18:00:22 +05:30
import { put } from "@vercel/blob";
import { NextResponse } from "next/server";
import { z } from "zod";
import { auth } from "@/app/(auth)/auth";
const FileSchema = z.object({
file: z
.instanceof(File)
.refine((file) => file.size <= 5 * 1024 * 1024, {
message: "File size should be less than 5MB",
})
.refine(
(file) =>
["image/jpeg", "image/png", "application/pdf"].includes(file.type),
{
message: "File type should be JPEG, PNG, or PDF",
},
),
});
export async function POST(request: Request) {
const session = await auth();
if (!session) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
if (request.body === null) {
return new Response("Request body is empty", { status: 400 });
}
try {
const formData = await request.formData();
const file = formData.get("file") as File;
if (!file) {
return NextResponse.json({ error: "No file uploaded" }, { status: 400 });
}
const validatedFile = FileSchema.safeParse({ file });
if (!validatedFile.success) {
const errorMessage = validatedFile.error.errors
.map((error) => error.message)
.join(", ");
return NextResponse.json({ error: errorMessage }, { status: 400 });
}
const filename = file.name;
const fileBuffer = await file.arrayBuffer();
try {
const data = await put(`${filename}`, fileBuffer, {
access: "public",
});
return NextResponse.json(data);
} catch (error) {
return NextResponse.json({ error: "Upload failed" }, { status: 500 });
}
} catch (error) {
return NextResponse.json(
{ error: "Failed to process request" },
{ status: 500 },
);
}
}