fix: normalize canvas image urls for server zip download
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-02-19 21:19:22 +08:00
parent 31b6e549b4
commit 171b4dce60
2 changed files with 19 additions and 3 deletions

View File

@ -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 || ""));

View File

@ -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() ||