route.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { NextRequest, NextResponse } from "next/server";
  2. import { PrismaClient } from "@prisma/client";
  3. const prisma = new PrismaClient();
  4. export const POST = async (req: NextRequest) => {
  5. try {
  6. const formData = await req.formData();
  7. const body = Object.fromEntries(formData);
  8. const file = (body.file as File) || null;
  9. if (!file) {
  10. const response = NextResponse.json({
  11. success: false,
  12. error: "No file provided",
  13. }, { status: 400 });
  14. response.headers.set('Access-Control-Allow-Origin', '*');
  15. return response;
  16. }
  17. // Convert file to buffer
  18. const buffer = Buffer.from(await file.arrayBuffer());
  19. // Store file in database
  20. const savedFile = await prisma.file.create({
  21. data: {
  22. filename: file.name,
  23. mimetype: file.type,
  24. size: file.size,
  25. data: buffer,
  26. },
  27. });
  28. const response = NextResponse.json({
  29. success: true,
  30. file: {
  31. id: savedFile.id,
  32. filename: savedFile.filename,
  33. mimetype: savedFile.mimetype,
  34. size: savedFile.size,
  35. createdAt: savedFile.createdAt,
  36. },
  37. });
  38. response.headers.set('Access-Control-Allow-Origin', '*');
  39. return response;
  40. } catch (error) {
  41. console.error("Upload error:", error);
  42. const response = NextResponse.json({
  43. success: false,
  44. error: "Failed to upload file",
  45. }, { status: 500 });
  46. response.headers.set('Access-Control-Allow-Origin', '*');
  47. return response;
  48. } finally {
  49. await prisma.$disconnect();
  50. }
  51. };
  52. export const OPTIONS = async () => {
  53. const response = new NextResponse(null, { status: 200 });
  54. response.headers.set('Access-Control-Allow-Origin', '*');
  55. response.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  56. response.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  57. return response;
  58. };