如何使用Golang将图片/文件上传至Wasabi存储桶?
使用Golang S3 SDK v2 上传文件至Wasabi存储桶
前置准备
- 安装S3 SDK v2核心依赖包:
go get github.com/aws/aws-sdk-go-v2/aws go get github.com/aws/aws-sdk-go-v2/config go get github.com/aws/aws-sdk-go-v2/service/s3 go get github.com/aws/aws-sdk-go-v2/feature/s3/manager - 准备Wasabi的API密钥(Access Key ID、Secret Access Key)、目标存储桶名称及对应区域(如
us-east-1)。
核心代码实现
1. 加载配置并初始化S3客户端
Wasabi兼容S3协议,只需指定其自定义端点即可复用AWS SDK:
package main import ( "context" "log" "os" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/s3/types" ) func main() { // 加载配置,指定Wasabi区域和端点 cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-east-1"), // 替换为你的Wasabi存储桶区域 config.WithEndpointResolverWithOptions(aws.EndpointResolverWithOptionsFunc( func(service, region string, options ...interface{}) (aws.Endpoint, error) { // 不同区域端点不同,比如us-west-1对应https://s3.us-west-1.wasabisys.com return aws.Endpoint{ URL: "https://s3.wasabisys.com", SigningRegion: "us-east-1", }, nil }, )), ) if err != nil { log.Fatalf("加载配置失败: %v", err) } // 初始化S3客户端 client := s3.NewFromConfig(cfg)
2. 上传本地文件到存储桶
使用s3manager.Uploader可自动处理大文件分块上传:
// 替换为实际的本地文件路径、存储桶名称和目标键 filePath := "./local-image.jpg" bucketName := "your-wasabi-bucket" targetKey := "uploads/image.jpg" // 打开本地文件 file, err := os.Open(filePath) if err != nil { log.Fatalf("打开文件失败: %v", err) } defer file.Close() // 创建上传器并执行上传 uploader := s3.NewUploader(client) _, err = uploader.Upload(context.TODO(), &s3.PutObjectInput{ Bucket: aws.String(bucketName), Key: aws.String(targetKey), Body: file, ACL: types.ObjectCannedACLPrivate, // 根据需求设置ACL,如public-read }) if err != nil { log.Fatalf("上传失败: %v", err) } log.Println("文件上传成功") }
关键注意事项
- 端点与区域匹配:Wasabi不同区域的端点不同,务必对应正确,否则会出现请求失败。
- 权限验证:确保API密钥拥有
s3:PutObject权限,且存储桶策略允许该密钥执行上传操作。 - 安全最佳实践:避免硬编码密钥,可通过
AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY环境变量传递凭证。
内容的提问来源于stack exchange,提问作者Carlo Nyte
相关产品推荐
相关产品推荐

