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;
|
apiUrl?: string;
|
||||||
apiKey?: string;
|
apiKey?: string;
|
||||||
type?: string; // "clean" | "face"
|
type?: string; // "clean" | "face"
|
||||||
scaleFactor?: number; // 1 | 2 | 4
|
scaleFactor?: number | string; // 1 | 2 | 4 | "auto"
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!config.apiUrl || !config.apiKey) {
|
if (!config.apiUrl || !config.apiKey) {
|
||||||
@ -228,19 +228,24 @@ export async function POST(request: NextRequest) {
|
|||||||
// 将Base64转换为Buffer
|
// 将Base64转换为Buffer
|
||||||
const imageBuffer = Buffer.from(imageBase64, "base64");
|
const imageBuffer = Buffer.from(imageBase64, "base64");
|
||||||
|
|
||||||
// 创建FormData
|
// 创建FormData(使用form-data包,Node.js环境)
|
||||||
const formData = new FormData();
|
const FormDataLib = await import("form-data");
|
||||||
const blob = new Blob([imageBuffer], { type: "image/jpeg" });
|
const formData = new FormDataLib.default();
|
||||||
formData.append("image_file", blob, "image.jpg");
|
formData.append("image_file", imageBuffer, {
|
||||||
|
filename: "image.jpg",
|
||||||
|
contentType: "image/jpeg",
|
||||||
|
});
|
||||||
formData.append("sync", "1"); // 同步模式
|
formData.append("sync", "1"); // 同步模式
|
||||||
formData.append("type", config.type || "clean"); // 默认通用清晰化
|
formData.append("type", config.type || "clean"); // 默认通用清晰化
|
||||||
if (config.scaleFactor) {
|
const scaleFactorValue = typeof config.scaleFactor === "number" ? config.scaleFactor : (config.scaleFactor === "auto" ? undefined : Number.parseInt(String(config.scaleFactor)));
|
||||||
formData.append("scale_factor", String(config.scaleFactor));
|
if (scaleFactorValue) {
|
||||||
|
formData.append("scale_factor", String(scaleFactorValue));
|
||||||
}
|
}
|
||||||
formData.append("return_type", "2"); // 返回base64
|
formData.append("return_type", "2"); // 返回base64
|
||||||
|
|
||||||
const headers: HeadersInit = {
|
const headers: Record<string, string> = {
|
||||||
"X-API-KEY": config.apiKey,
|
"X-API-KEY": config.apiKey,
|
||||||
|
...formData.getHeaders(), // 包含Content-Type和boundary
|
||||||
};
|
};
|
||||||
|
|
||||||
const startTime = Date.now();
|
const startTime = Date.now();
|
||||||
@ -251,10 +256,21 @@ export async function POST(request: NextRequest) {
|
|||||||
const controller = new AbortController();
|
const controller = new AbortController();
|
||||||
const timeoutId = setTimeout(() => controller.abort(), 60000);
|
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, {
|
response = await fetch(enhanceUrl, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers,
|
headers,
|
||||||
body: formData,
|
body: formDataBuffer,
|
||||||
signal: controller.signal,
|
signal: controller.signal,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -40,6 +40,7 @@
|
|||||||
"@radix-ui/react-tabs": "^1.1.13",
|
"@radix-ui/react-tabs": "^1.1.13",
|
||||||
"@radix-ui/react-use-controllable-state": "^1.2.2",
|
"@radix-ui/react-use-controllable-state": "^1.2.2",
|
||||||
"@radix-ui/react-visually-hidden": "^1.1.0",
|
"@radix-ui/react-visually-hidden": "^1.1.0",
|
||||||
|
"@types/form-data": "^2.5.2",
|
||||||
"@vercel/analytics": "^1.3.1",
|
"@vercel/analytics": "^1.3.1",
|
||||||
"@vercel/blob": "^0.24.1",
|
"@vercel/blob": "^0.24.1",
|
||||||
"@vercel/functions": "^2.0.0",
|
"@vercel/functions": "^2.0.0",
|
||||||
@ -57,6 +58,7 @@
|
|||||||
"drizzle-orm": "^0.34.0",
|
"drizzle-orm": "^0.34.0",
|
||||||
"embla-carousel-react": "^8.6.0",
|
"embla-carousel-react": "^8.6.0",
|
||||||
"fast-deep-equal": "^3.1.3",
|
"fast-deep-equal": "^3.1.3",
|
||||||
|
"form-data": "^4.0.5",
|
||||||
"framer-motion": "^11.3.19",
|
"framer-motion": "^11.3.19",
|
||||||
"geist": "^1.3.1",
|
"geist": "^1.3.1",
|
||||||
"katex": "^0.16.25",
|
"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