encore-go-bucket

Par encoredev · skills

Stockez des fichiers non structurés dans Encore Go en utilisant `objects.NewBucket` depuis `encore.dev/storage/objects` — uploads, images, documents, blobs.

npx skills add https://github.com/encoredev/skills --skill encore-go-bucket

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: true que 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.

Skills similaires