From 00f2e32631da7fd750b919dd09990f166f90c5c4 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 3 Feb 2026 10:56:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=94=BB=E5=9B=BE=E6=A0=87=E6=B3=A8?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=90=8E=E5=85=88=E4=B8=8A=E4=BC=A0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=88=B0=E6=9C=8D=E5=8A=A1=E5=99=A8=E8=8E=B7=E5=8F=96?= =?UTF-8?q?URL=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BD=BF=E7=94=A8base64?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/chat.tsx | 65 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 12 deletions(-) diff --git a/components/chat.tsx b/components/chat.tsx index 67c8186..9bea097 100644 --- a/components/chat.tsx +++ b/components/chat.tsx @@ -583,21 +583,62 @@ export function Chat({ }; // 处理画图标注完成 - const handleDrawingComplete = (annotatedImageUrl: string) => { - // annotatedImageUrl 是 base64 data URL 格式 + const handleDrawingComplete = async (annotatedImageUrl: string) => { + // annotatedImageUrl 是 base64 data URL 格式,需要先上传到服务器获取 URL const fileName = `annotated-${Date.now()}.png`; - setAttachments((prev) => [ - ...prev, - { - url: annotatedImageUrl, - name: fileName, - contentType: "image/png", - }, - ]); + try { + // 如果是 base64 格式,先上传到服务器 + if (annotatedImageUrl.startsWith("data:")) { + toast.info("正在上传标注图片..."); + + // 将 base64 转换为 Blob + const response = await fetch(annotatedImageUrl); + const blob = await response.blob(); + + // 创建 FormData 上传 + const formData = new FormData(); + formData.append("file", blob, fileName); + + const uploadResponse = await fetch("/api/files/upload", { + method: "POST", + body: formData, + }); + + if (!uploadResponse.ok) { + throw new Error("上传失败"); + } + + const uploadResult = await uploadResponse.json(); + + setAttachments((prev) => [ + ...prev, + { + url: uploadResult.url, + name: fileName, + contentType: "image/png", + }, + ]); + + toast.success("标注图片已添加"); + } else { + // 如果已经是 URL,直接使用 + setAttachments((prev) => [ + ...prev, + { + url: annotatedImageUrl, + name: fileName, + contentType: "image/png", + }, + ]); + } - // 如果输入框为空,自动填入提示词 - setInput((prev) => prev ? prev : "请根据我的标注修改这张图片:"); + // 如果输入框为空,自动填入提示词 + setInput((prev) => prev ? prev : "请根据我的标注修改这张图片:"); + } catch (error) { + console.error("上传标注图片失败:", error); + toast.error("上传标注图片失败,请重试"); + } }; // 处理图片变清晰