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