Upload de arquivos
Permita que as pessoas enviem avatares, fotos ou documentos pelo seu app. Os arquivos são protegidos pelo mesmo tipo de regras de segurança que suas tabelas.
1. Crie buckets
Em Armazenamento, crie um bucket. Um bucket público (por exemplo, avatars) entrega os arquivos a qualquer pessoa com a URL; um privado (por exemplo, documents), só por meio de links assinados. Você pode limitar o tamanho dos arquivos e os tipos permitidos (por exemplo, image/*).
2. Quem pode enviar arquivos
Uploads, substituições e exclusões seguem as políticas de storage.objects. Até você adicionar alguma, ninguém pode enviar arquivos pelo app. O padrão comum é uma pasta por usuário:
-- 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. Envie arquivos pelo seu 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. Arquivos privados e links assinados
// 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`]);Bom saber
- Os uploads contam para o armazenamento de arquivos do seu plano, e os downloads, para a largura de banda dele.
- Caminhos como
<user id>/avatar.pngsão nomes simples: as pastas aparecem conforme você envia arquivos. - A chave secreta (somente no seu servidor) ignora as políticas de armazenamento, assim como faz com as tabelas.