fix: 修复变清晰API中FormData的使用 - 使用form-data包并正确处理Buffer转换

This commit is contained in:
Your Name 2025-12-29 01:08:17 +08:00
parent 615f82aec7
commit d12e831f93
3 changed files with 1569 additions and 11 deletions

View File

@ -160,7 +160,7 @@ export async function POST(request: NextRequest) {
apiUrl?: string;
apiKey?: string;
type?: string; // "clean" | "face"
scaleFactor?: number; // 1 | 2 | 4
scaleFactor?: number | string; // 1 | 2 | 4 | "auto"
};
if (!config.apiUrl || !config.apiKey) {
@ -228,19 +228,24 @@ export async function POST(request: NextRequest) {
// 将Base64转换为Buffer
const imageBuffer = Buffer.from(imageBase64, "base64");
// 创建FormData
const formData = new FormData();
const blob = new Blob([imageBuffer], { type: "image/jpeg" });
formData.append("image_file", blob, "image.jpg");
// 创建FormData(使用form-data包,Node.js环境)
const FormDataLib = await import("form-data");
const formData = new FormDataLib.default();
formData.append("image_file", imageBuffer, {
filename: "image.jpg",
contentType: "image/jpeg",
});
formData.append("sync", "1"); // 同步模式
formData.append("type", config.type || "clean"); // 默认通用清晰化
if (config.scaleFactor) {
formData.append("scale_factor", String(config.scaleFactor));
const scaleFactorValue = typeof config.scaleFactor === "number" ? config.scaleFactor : (config.scaleFactor === "auto" ? undefined : Number.parseInt(String(config.scaleFactor)));
if (scaleFactorValue) {
formData.append("scale_factor", String(scaleFactorValue));
}
formData.append("return_type", "2"); // 返回base64
const headers: HeadersInit = {
const headers: Record<string, string> = {
"X-API-KEY": config.apiKey,
...formData.getHeaders(), // 包含Content-Type和boundary
};
const startTime = Date.now();
@ -251,10 +256,21 @@ export async function POST(request: NextRequest) {
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), 60000);
// 将FormData转换为ArrayBuffer(fetch需要)
const formDataBuffer = await new Promise<ArrayBuffer>((resolve, reject) => {
const chunks: Buffer[] = [];
formData.on("data", (chunk: Buffer) => chunks.push(chunk));
formData.on("end", () => {
const buffer = Buffer.concat(chunks);
resolve(buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength));
});
formData.on("error", reject);
});
response = await fetch(enhanceUrl, {
method: "POST",
headers,
body: formData,
body: formDataBuffer,
signal: controller.signal,
});

View File

@ -40,6 +40,7 @@
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-use-controllable-state": "^1.2.2",
"@radix-ui/react-visually-hidden": "^1.1.0",
"@types/form-data": "^2.5.2",
"@vercel/analytics": "^1.3.1",
"@vercel/blob": "^0.24.1",
"@vercel/functions": "^2.0.0",
@ -57,6 +58,7 @@
"drizzle-orm": "^0.34.0",
"embla-carousel-react": "^8.6.0",
"fast-deep-equal": "^3.1.3",
"form-data": "^4.0.5",
"framer-motion": "^11.3.19",
"geist": "^1.3.1",
"katex": "^0.16.25",

1544
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff