GUIA

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.

← Todos os guias

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.png sã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.