50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { uploadBuffer, generateObjectKey } from "@/app/lib/minio";
|
|
|
|
const MAX_SIZE = 20 * 1024 * 1024; // 20MB
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const form = await request.formData();
|
|
const file = form.get("file");
|
|
const fileObj =
|
|
file != null && typeof file === "object" && "size" in file
|
|
? (file as File | Blob)
|
|
: null;
|
|
|
|
if (!fileObj || fileObj.size === 0) {
|
|
return NextResponse.json(
|
|
{ ok: false, error: "请选择文件" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
if (fileObj.size > MAX_SIZE) {
|
|
return NextResponse.json(
|
|
{ ok: false, error: "文件大小不能超过 20MB" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
const ext =
|
|
(fileObj instanceof File ? fileObj.name : "").split(".").pop() ||
|
|
(fileObj.type?.startsWith("video/") ? "mp4" : "jpg");
|
|
const objectKey = generateObjectKey(ext);
|
|
|
|
const buffer = Buffer.from(await fileObj.arrayBuffer());
|
|
const contentType =
|
|
(fileObj as File).type || "application/octet-stream";
|
|
|
|
const { url } = await uploadBuffer(buffer, objectKey, contentType);
|
|
|
|
return NextResponse.json({ ok: true, url });
|
|
} catch (e) {
|
|
const msg = e instanceof Error ? e.message : String(e);
|
|
console.error("Upload media error:", e);
|
|
return NextResponse.json(
|
|
{ ok: false, error: `上传失败: ${msg}` },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|