GUÍA

Subida de archivos

Permite que las personas suban avatares, fotos o documentos desde tu app. Los archivos están protegidos por el mismo tipo de reglas de seguridad que tus tablas.

← Todas las guías

1. Crea buckets

En Almacenamiento, crea un bucket. Un bucket público (p. ej., avatars) entrega los archivos a cualquiera que tenga la URL; uno privado (p. ej., documents), solo mediante enlaces firmados. Puedes limitar el tamaño de los archivos y los tipos permitidos (p. ej., image/*).

2. Quién puede subir archivos

Las subidas, los reemplazos y las eliminaciones siguen las políticas de storage.objects. Hasta que agregues alguna, nadie puede subir archivos desde la app. Lo habitual es una carpeta por usuario:

-- 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. Sube archivos desde tu app

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. Archivos privados y enlaces firmados

// 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`]);

Para tener en cuenta

  • Las subidas cuentan para el almacenamiento de archivos de tu plan, y las descargas, para su ancho de banda.
  • Las rutas como <user id>/avatar.png son nombres simples: las carpetas aparecen a medida que subes archivos.
  • La clave secreta (solo en tu servidor) omite las políticas de almacenamiento, igual que con las tablas.