fix: use server-side fetch for logo save (bypass CORS), detect file MIME on extension

This commit is contained in:
openhands committed 2026-07-03 17:05:25 +02:00
1 parent 6df4fe2ddd
commit 917437c5ef
2 files changed
+44 -19

No files matched your search

+33
View File
@@ -38,3 +38,36 @@ export async function saveLogo(formData: FormData): Promise<{ success: boolean;
return { success: false, error: e instanceof Error ? e.message : "Unknown error" };
}
}
export async function saveLogoFromUrl(gifUrl: string): Promise<{ success: boolean; url?: string; error?: string }> {
try {
const res = await fetch(gifUrl);
if (!res.ok) return { success: false, error: `Failed to fetch GIF: ${res.status}` };
const contentType = res.headers.get("content-type") ?? "image/gif";
const buffer = Buffer.from(await res.arrayBuffer());
const mimeExt: Record<string, string> = { "image/png": "png", "image/gif": "gif", "image/jpeg": "jpg", "image/webp": "webp" };
const ext = mimeExt[contentType] ?? "gif";
const filename = `logo-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.${ext}`;
const dir = path.join(process.cwd(), MEDIA_DIR);
const filePath = path.join(dir, filename);
await writeFile(filePath, buffer);
const url = `/api/media/${filename}`;
await prisma.websiteSetting.upsert({
where: { key: "cms_logo" },
update: { value: url },
create: { key: "cms_logo", value: url, comment: "Logo (generator)" },
});
siteSettings.reload();
revalidatePath("/", "layout");
return { success: true, url };
} catch (e) {
return { success: false, error: e instanceof Error ? e.message : "Unknown error" };
}
}