1 Commits

Author SHA1 Message Date
s4luorth
84427d8ca3 Motiv-/Datei-Upload: ueber oeffentlichen Proxy (Gaeste ohne Login)
All checks were successful
Build & Deploy / deploy (push) Successful in 45s
uploadFile schickt die Datei als Base64 an /skrift-orders/upload statt direkt an
Directus /files (das braucht einen Token, den Gaeste nicht haben).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-03 10:13:45 +02:00

View File

@@ -481,17 +481,21 @@ export const paypalClientId = (s: PublicSettings | null) =>
/** Lädt eine Datei nach Directus und liefert deren ID. */ /** Lädt eine Datei nach Directus und liefert deren ID. */
export async function uploadFile(datei: File): Promise<string> { export async function uploadFile(datei: File): Promise<string> {
const form = new FormData(); // Als Base64 (Data-URL) an den öffentlichen Upload-Proxy schicken – so können
form.append('file', datei); // auch Gäste (Bestellung ohne Login) Motive/Quelldateien hochladen. Der direkte
// Directus-/files-Upload braucht einen Token, den Gäste nicht haben.
const session = await ensureFreshToken(); const data_base64 = await new Promise<string>((resolve, reject) => {
const res = await fetch(`${BASE}/files`, { const r = new FileReader();
method: 'POST', r.onload = () => resolve(String(r.result || ''));
headers: session ? { Authorization: `Bearer ${session.access_token}` } : undefined, r.onerror = () => reject(new Error('Datei konnte nicht gelesen werden.'));
body: form, r.readAsDataURL(datei);
}); });
const data = await parse(res); const data = await request('/skrift-orders/upload', {
return data?.data?.id; method: 'POST',
auth: false,
body: { filename: datei.name, content_type: datei.type || 'application/octet-stream', data_base64 },
});
return data?.id;
} }
/* ── Angebotsanfrage ──────────────────────────────────────────────────────── */ /* ── Angebotsanfrage ──────────────────────────────────────────────────────── */