Cloudflare R2

Connect to Cloudflare R2 through its S3-compatible HTTP API.

Create the adapter

package main

import (
	"context"
	"os"

	files "github.com/cersho/gofiles-sdk"
	"github.com/cersho/gofiles-sdk/providers/r2"
)

func newClient(ctx context.Context) (*files.Client, error) {
	adapter, err := r2.New(ctx, r2.Options{
		Bucket: "uploads",
		AccountID: os.Getenv("R2_ACCOUNT_ID"),
		AccessKeyID: os.Getenv("R2_ACCESS_KEY_ID"),
		SecretAccessKey: os.Getenv("R2_SECRET_ACCESS_KEY"),
	})
	if err != nil {
		return nil, err
	}

	return files.New(files.Options{Adapter: adapter})
}

Environment variables

You can pass credentials directly or use environment variables.

VariablePurpose
R2_ACCOUNT_IDCloudflare account ID.
R2_ACCESS_KEY_IDR2 access key ID.
R2_SECRET_ACCESS_KEYR2 secret access key.

Signed uploads

R2 supports presigned PUT uploads. It does not support S3 POST Object policies, so SignedUploadOptions.MaxSize returns a provider error.

upload, err := client.SignedUploadURL(ctx, "uploads/report.pdf", files.SignedUploadOptions{
	ContentType: "application/pdf",
	ExpiresIn: 10 * time.Minute,
})
if err != nil {
	return err
}

fmt.Println(upload.Method)
// Output: PUT

On this page