Luminaria / frontend /app /api /upload /route.ts
senlinyy's picture
fix: change the file size limit
8ac2dd1
Raw
History Blame Contribute Delete
1.97 kB
import { type NextRequest, NextResponse } from "next/server";
import { backendUrl } from "@/lib/backend-url";
// Stream multipart uploads to FastAPI. Calling request.formData() here buffers
// the whole PDF in Next.js and can fail before the backend sees the file.
export const dynamic = "force-dynamic";
export const runtime = "nodejs";
export async function POST(request: NextRequest) {
const backend = backendUrl();
const headers = new Headers();
const requestContentType = request.headers.get("content-type");
const requestContentLength = request.headers.get("content-length");
const cookie = request.headers.get("cookie");
console.info("[upload proxy] received upload request", {
contentType: requestContentType,
contentLength: requestContentLength,
hasBody: Boolean(request.body),
});
if (!requestContentType?.includes("multipart/form-data")) {
return NextResponse.json(
{
detail: `Upload request must be multipart/form-data; received ${requestContentType ?? "no content-type"}.`,
},
{ status: 400 }
);
}
if (requestContentType) headers.set("content-type", requestContentType);
if (cookie) headers.set("cookie", cookie);
if (!request.body) {
return NextResponse.json({ detail: "Upload request did not include a file body." }, { status: 400 });
}
let response: Response;
try {
response = await fetch(`${backend}/upload`, {
method: "POST",
body: request.body,
duplex: "half",
headers,
} as RequestInit & { duplex: "half" });
} catch (error) {
return NextResponse.json(
{ detail: `Could not reach the backend upload service: ${(error as Error).message}` },
{ status: 502 }
);
}
const contentType = response.headers.get("content-type") ?? "text/plain; charset=utf-8";
const body = await response.text();
return new NextResponse(body, {
status: response.status,
headers: { "content-type": contentType },
});
}