准备

需要准备Cloudflare的accountId,相应的R2 ak skbucketName等信息.

var (
		accountId       = "xxxxx"
		accessKeyId     = "cbdade718b2ca877882csssssfcf"
		accessKeySecret = "04917c7d745422022e266f6b06"
		bucketName      = "gopher"
	)

完整代码

package main

import (
	"context"
	"fmt"
	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/credentials"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"log"
)

func main() {
var (
		accountId       = "xxxxx"
		accessKeyId     = "cbdade718b2ca877882csssssfcf"
		accessKeySecret = "04917c7d745422022e266f6b06"
		bucketName      = "gopher"
	)
	var r2Resolver = aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
		return aws.Endpoint{
			URL: fmt.Sprintf("https://%s.r2.cloudflarestorage.com", accountId),
		}, nil
	})

	cfg, err := config.LoadDefaultConfig(context.TODO(),
		config.WithEndpointResolverWithOptions(r2Resolver),
		config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accessKeyId, accessKeySecret, "")),
	)
	if err != nil {
		log.Fatal(err)
	}

	client := s3.NewFromConfig(cfg)

	listObjectsOutput, err := client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
		Bucket: &bucketName,
	})
	if err != nil {
		log.Fatal(err)
	}
	presignClient := s3.NewPresignClient(client)

	for _, object := range listObjectsOutput.Contents {
		// 创建文件访问链接
		presignResult, err := presignClient.PresignGetObject(context.TODO(), &s3.GetObjectInput{
			Bucket: aws.String(bucketName),
			Key:    aws.String(*object.Key),
		})

		if err != nil {
			panic("Couldn't get presigned URL for PutObject")
		}

		fmt.Printf("get URL For object: %s\n", presignResult.URL)
	}

}