diff --git a/app/api/canvas/download-zip/route.ts b/app/api/canvas/download-zip/route.ts index 34018529b..b2d719269 100644 --- a/app/api/canvas/download-zip/route.ts +++ b/app/api/canvas/download-zip/route.ts @@ -46,6 +46,15 @@ function sanitizeFolderName(value: string): string { return cleaned || `canvas-images-${Date.now()}`; } +function getRequestOrigin(request: NextRequest): string { + const forwardedHost = (request.headers.get("x-forwarded-host") || "").split(",")[0]?.trim(); + const forwardedProto = (request.headers.get("x-forwarded-proto") || "").split(",")[0]?.trim(); + if (forwardedHost && forwardedProto) { + return `${forwardedProto}://${forwardedHost}`; + } + return new URL(request.url).origin; +} + function toDownloadItems(input: unknown, origin: string): DownloadFileItem[] { if (!Array.isArray(input)) return []; return input @@ -79,7 +88,7 @@ export async function POST(request: NextRequest) { } const body = await request.json().catch(() => ({})); - const requestOrigin = new URL(request.url).origin; + const requestOrigin = getRequestOrigin(request); const files = toDownloadItems((body as any)?.files, requestOrigin); const folderName = sanitizeFolderName(String((body as any)?.folderName || "")); diff --git a/components/canvas/CanvasWorkspace.tsx b/components/canvas/CanvasWorkspace.tsx index 4ef390fb1..0ccadebc1 100644 --- a/components/canvas/CanvasWorkspace.tsx +++ b/components/canvas/CanvasWorkspace.tsx @@ -537,11 +537,18 @@ export function CanvasWorkspace() { const now = new Date(); const folderName = `canvas-images-${now.getFullYear()}${String(now.getMonth() + 1).padStart(2, "0")}${String(now.getDate()).padStart(2, "0")}-${String(now.getHours()).padStart(2, "0")}${String(now.getMinutes()).padStart(2, "0")}${String(now.getSeconds()).padStart(2, "0")}`; + const browserOrigin = typeof window !== "undefined" ? window.location.origin : ""; const files = selectedImageNodes .map((node, index) => { const nodeData = node.data as any; - const imageUrl = String(nodeData?.src || "").trim(); - if (!imageUrl) return null; + const rawImageUrl = String(nodeData?.src || "").trim(); + if (!rawImageUrl) return null; + let imageUrl = rawImageUrl; + if (browserOrigin && rawImageUrl.startsWith("/")) { + imageUrl = `${browserOrigin}${rawImageUrl}`; + } else if (browserOrigin && rawImageUrl.startsWith("//")) { + imageUrl = `${window.location.protocol}${rawImageUrl}`; + } const name = String(nodeData?.title || "").trim() || String(nodeData?.prompt || "").trim() ||