Stockage d'objets Encore Go
Instructions
Un Bucket est un stockage logique pour les fichiers. Encore provisionne le stockage d'objets sous-jacent (S3 sur AWS, GCS sur GCP, en mémoire localement). Déclarez les buckets comme variables au niveau du package.
package uploads
import "encore.dev/storage/objects"
// Bucket privé (par défaut)
var Uploads = objects.NewBucket("user-uploads", objects.BucketConfig{})
// Bucket public — fichiers accessibles via URL publique
var PublicAssets = objects.NewBucket("public-assets", objects.BucketConfig{
Public: true,
})
Opérations
import (
"fmt"
"io"
)
// Upload (pattern streaming)
writer := Uploads.Upload(ctx, "path/to/file.jpg")
_, err := io.Copy(writer, dataReader)
if err != nil {
writer.Abort()
return err
}
err = writer.Close()
// Download
reader := Uploads.Download(ctx, "path/to/file.jpg")
if err := reader.Err(); err != nil {
return err
}
defer reader.Close()
data, _ := io.ReadAll(reader)
// Vérification d'existence
exists, err := Uploads.Exists(ctx, "path/to/file.jpg")
// Attributs (taille, type de contenu, ETag)
attrs, err := Uploads.Attrs(ctx, "path/to/file.jpg")
// Lister
for err, entry := range Uploads.List(ctx, &objects.Query{}) {
if err != nil {
return err
}
fmt.Println(entry.Key, entry.Size)
}
// Supprimer
err := Uploads.Remove(ctx, "path/to/file.jpg")
// URL publique (seulement pour les buckets publics)
url := PublicAssets.PublicURL("image.jpg")
URLs signées
Générez des URLs temporaires pour que les clients puissent charger/télécharger directement sans passer par votre service :
import "time"
// URL d'upload signée (expire dans 2 heures)
url, err := Uploads.SignedUploadURL(ctx, "user-uploads/avatar.jpg",
objects.WithTTL(time.Duration(7200)*time.Second))
// URL de download signée
url, err := Uploads.SignedDownloadURL(ctx, "documents/report.pdf",
objects.WithTTL(time.Duration(7200)*time.Second))
Références de bucket
Passez l'accès au bucket au code de bibliothèque avec un ensemble de permissions spécifique :
// Créez une référence avec permission de download seulement
ref := objects.BucketRef[objects.Downloader](Uploads)
// Combinez les permissions via une interface
type myPerms interface {
objects.Downloader
objects.Uploader
}
ref := objects.BucketRef[myPerms](Uploads)
// Types de permission : Downloader, Uploader, Lister, Attrser, Remover,
// SignedDownloader, SignedUploader, ReadWriter
Recommandations
- Déclarez les buckets comme variables au niveau du package.
- Privilégiez les buckets privés ; n'activez
Public: trueque pour les assets destinés au téléchargement non authentifié. - Utilisez les URLs signées pour les uploads/downloads navigateur au lieu de les faire transiter par votre service.
- Utilisez les références de bucket quand vous passez l'accès à des helpers — elles encodent le contrat de permission dans le système de types.