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.
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.pngson 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.