fix: 修复变清晰API中FormData的使用 - 使用form-data包并正确处理Buffer转换
This commit is contained in:
parent
615f82aec7
commit
d12e831f93
@ -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,
|
||||
});
|
||||
|
||||
|
||||
@ -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
1544
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user