ANLEITUNG

Datei-Uploads

Lass Leute Avatare, Fotos oder Dokumente aus deiner App hochladen. Dateien sind durch dieselbe Art von Sicherheitsregeln geschützt wie deine Tabellen.

← Alle Anleitungen

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.png sind einfache Namen: Ordner entstehen beim Hochladen.
  • Der geheime Schlüssel (nur auf deinem Server) umgeht die Speicher-Richtlinien, genau wie bei Tabellen.