GUIDE

Envoi de fichiers

Permettez aux gens d'envoyer des avatars, des photos ou des documents depuis votre app. Les fichiers sont protégés par le même type de règles de sécurité que vos tables.

← Tous les guides

1. Créez des buckets

Dans Stockage, créez un bucket. Un bucket public (par ex. avatars) sert les fichiers à toute personne qui a l'URL ; un bucket privé (par ex. documents), uniquement via des liens signés. Vous pouvez limiter la taille des fichiers et les types autorisés (par ex. image/*).

2. Qui peut envoyer des fichiers

Les envois, remplacements et suppressions suivent les politiques de storage.objects. Tant que vous n'en ajoutez pas, personne ne peut envoyer de fichiers depuis l'app. Un dossier par utilisateur est le schéma habituel :

-- 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. Envoyez des fichiers depuis votre 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. Fichiers privés et liens signés

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

Bon à savoir

  • Les envois comptent dans le stockage de fichiers de votre offre, et les téléchargements dans sa bande passante.
  • Les chemins comme <user id>/avatar.png sont de simples noms : les dossiers apparaissent au fil de vos envois.
  • La clé secrète (uniquement sur votre serveur) contourne les politiques de stockage, comme pour les tables.