Datei-Uploads
Lass Leute Avatare, Fotos oder Dokumente aus deiner App hochladen. Dateien sind durch dieselbe Art von Sicherheitsregeln geschützt wie deine Tabellen.
1. Buckets anlegen
Leg unter Speicher einen Bucket an. Ein öffentlicher Bucket (z. B. avatars) liefert Dateien an alle mit der URL aus; ein privater (z. B. documents) nur über signierte Links. Du kannst die Dateigröße und die erlaubten Typen begrenzen (z. B. image/*).
2. Wer hochladen darf
Uploads, Ersetzungen und Löschungen folgen Richtlinien auf storage.objects. Solange du keine hinzufügst, kann niemand aus der App hochladen. Üblich ist ein Ordner pro Nutzer:
-- Signed-in users may upload, replace and delete files only in their own folder: <user id>/… create policy "Upload to own folder" on storage.objects for insert with check (bucket_id = 'avatars' and (storage.foldername(name))[1] = espobase.user_id()::text); create policy "Replace own files" on storage.objects for update using (bucket_id = 'avatars' and (storage.foldername(name))[1] = espobase.user_id()::text) with check (bucket_id = 'avatars' and (storage.foldername(name))[1] = espobase.user_id()::text); create policy "Delete own files" on storage.objects for delete using (bucket_id = 'avatars' and (storage.foldername(name))[1] = espobase.user_id()::text); -- For a private bucket, also allow reading your own files: create policy "Read own files" on storage.objects for select using (bucket_id = 'documents' and (storage.foldername(name))[1] = espobase.user_id()::text);
3. Aus deiner App hochladen
const { data: me } = await espobase.auth.getUser();
const path = `${me!.user.id}/avatar.png`;
// Upload (upsert replaces an existing file at the same path).
const { error } = await espobase.storage.from("avatars").upload(path, file, { upsert: true });
// Public bucket: a permanent URL anyone can open.
const { publicUrl } = espobase.storage.from("avatars").getPublicUrl(path);4. Private Dateien und signierte Links
// Private bucket: a link that works for 10 minutes, created by someone allowed to read the file.
const { data } = await espobase.storage.from("documents").createSignedUrl(`${userId}/contract.pdf`, 600);
window.open(data!.signedUrl);
// List and delete
const { data: files } = await espobase.storage.from("documents").list(`${userId}/`);
await espobase.storage.from("documents").remove([`${userId}/old.pdf`]);Gut zu wissen
- Uploads zählen zum Dateispeicher deines Tarifs, Downloads zu seiner Bandbreite.
- Pfade wie
<user id>/avatar.pngsind einfache Namen: Ordner entstehen beim Hochladen. - Der geheime Schlüssel (nur auf deinem Server) umgeht die Speicher-Richtlinien, genau wie bei Tabellen.