mcpField
E
encore-go-bucket

encore-go-bucket

github.com/encoredev云与 DevOps30317 次安装2 天前更新
代码仓库

关于 encore-go-bucket

为 Encore Go 项目提供对象存储用法指导,适合需要在 Go 服务中管理文件存储的开发者。内容涉及流式文件操作、签名 URL 和权限化存储桶引用。

主要功能

  1. 01声明私有或公开存储桶
  2. 02流式上传和下载文件
  3. 03生成临时签名 URL
  4. 04按权限创建存储桶引用

适用场景

  1. 01让浏览器通过签名 URL 上传或下载文件
  2. 02向库代码传递受限存储桶访问权限

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/encore-go-bucket确认已加载。

详细介绍

Encore Go 对象存储

说明

Bucket 是用于存储文件的逻辑存储。Encore 会配置底层对象存储(AWS 上使用 S3,GCP 上使用 GCS,本地使用内存存储)。将存储桶声明为包级变量。

package uploads

import "encore.dev/storage/objects"

// Private bucket (default)
var Uploads = objects.NewBucket("user-uploads", objects.BucketConfig{})

// Public bucket — files accessible via public URL
var PublicAssets = objects.NewBucket("public-assets", objects.BucketConfig{
    Public: true,
})

操作

import (
    "fmt"
    "io"
)

// Upload (streaming pattern)
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)

// Existence check
exists, err := Uploads.Exists(ctx, "path/to/file.jpg")

// Attributes (size, content type, ETag)
attrs, err := Uploads.Attrs(ctx, "path/to/file.jpg")

// List
for err, entry := range Uploads.List(ctx, &objects.Query{}) {
    if err != nil {
        return err
    }
    fmt.Println(entry.Key, entry.Size)
}

// Delete
err := Uploads.Remove(ctx, "path/to/file.jpg")

// Public URL (only for public buckets)
url := PublicAssets.PublicURL("image.jpg")

签名 URL

生成临时 URL,让客户端直接上传/下载,而无需经过你的服务:

import "time"

// Signed upload URL (expires in 2 hours)
url, err := Uploads.SignedUploadURL(ctx, "user-uploads/avatar.jpg",
    objects.WithTTL(time.Duration(7200)*time.Second))

// Signed download URL
url, err := Uploads.SignedDownloadURL(ctx, "documents/report.pdf",
    objects.WithTTL(time.Duration(7200)*time.Second))

存储桶引用

使用特定权限集将存储桶访问权限传递给库代码:

// Create a reference with download permission only
ref := objects.BucketRef[objects.Downloader](Uploads)

// Combine permissions via an interface
type myPerms interface {
    objects.Downloader
    objects.Uploader
}
ref := objects.BucketRef[myPerms](Uploads)

// Permission types: Downloader, Uploader, Lister, Attrser, Remover,
// SignedDownloader, SignedUploader, ReadWriter

指南

  • 将存储桶声明为包级变量。
  • 默认使用私有存储桶;仅当资产需要允许未经身份验证的下载时,才设置 Public: true。
  • 使用签名 URL 进行浏览器上传/下载,而不是通过你的服务流式传输。
  • 向辅助代码传递访问权限时使用存储桶引用——它们会在类型系统中编码权限约定。

评论

支持 Markdown