Go语言作为高性能的后端开发语言,常被用于对接各类云服务,其中AWS S3是最常用的对象存储服务之一。通过AWS官方提供的Go SDK,我们可以轻松实现与S3存储桶的交互,完成各类文件管理操作。

环境准备与依赖安装
首先需要在项目中引入AWS S3的Go SDK,执行以下命令安装依赖:
go get github.com/aws/aws-sdk-go/v2 go get github.com/aws/aws-sdk-go/v2/config go get github.com/aws/aws-sdk-go/v2/service/s3
初始化S3客户端
连接AWS S3需要先初始化客户端,需要提前准备好AWS的访问密钥ID和秘密访问密钥,以及对应的区域信息。以下是初始化客户端的示例代码:
package main
import (
"context"
"fmt"
"log"
"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"
)
func initS3Client() (*s3.Client, error) {
// 加载AWS配置,默认会从环境变量、~/.aws/credentials等位置读取凭证
cfg, err := config.LoadDefaultConfig(context.TODO(),
config.WithRegion("us-east-1"), // 替换为你的S3所在区域
)
if err != nil {
return nil, fmt.Errorf("加载AWS配置失败: %v", err)
}
// 创建S3客户端
client := s3.NewFromConfig(cfg)
return client, nil
}
func main() {
client, err := initS3Client()
if err != nil {
log.Fatalf("初始化S3客户端失败: %v", err)
}
fmt.Println("S3客户端初始化成功")
_ = client
}
核心操作示例
上传文件到S3存储桶
上传文件需要指定存储桶名称、对象键(文件路径)以及文件内容,以下是上传本地文件的示例:
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func uploadFile(client *s3.Client, bucketName, objectKey, filePath string) error {
// 打开本地文件
file, err := os.Open(filePath)
if err != nil {
return fmt.Errorf("打开文件失败: %v", err)
}
defer file.Close()
// 使用上传管理器上传文件,支持大文件分片上传
uploader := manager.NewUploader(client)
_, err = uploader.Upload(context.TODO(), &s3.PutObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectKey),
Body: file,
})
if err != nil {
return fmt.Errorf("上传文件失败: %v", err)
}
return nil
}
func main() {
client, err := initS3Client()
if err != nil {
log.Fatalf("初始化S3客户端失败: %v", err)
}
// 替换为你的存储桶名称、对象键和本地文件路径
err = uploadFile(client, "test-bucket-ipipp", "uploads/test.txt", "./test.txt")
if err != nil {
log.Fatalf("上传失败: %v", err)
}
fmt.Println("文件上传成功")
}
从S3存储桶下载文件
下载文件需要指定存储桶名称和对象键,将文件保存到本地路径,示例代码如下:
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func downloadFile(client *s3.Client, bucketName, objectKey, savePath string) error {
// 创建本地文件
file, err := os.Create(savePath)
if err != nil {
return fmt.Errorf("创建本地文件失败: %v", err)
}
defer file.Close()
// 使用下载管理器下载文件
downloader := manager.NewDownloader(client)
_, err = downloader.Download(context.TODO(), file, &s3.GetObjectInput{
Bucket: &bucketName,
Key: &objectKey,
})
if err != nil {
return fmt.Errorf("下载文件失败: %v", err)
}
return nil
}
func main() {
client, err := initS3Client()
if err != nil {
log.Fatalf("初始化S3客户端失败: %v", err)
}
// 替换为你的存储桶名称、对象键和本地保存路径
err = downloadFile(client, "test-bucket-ipipp", "uploads/test.txt", "./downloaded_test.txt")
if err != nil {
log.Fatalf("下载失败: %v", err)
}
fmt.Println("文件下载成功")
}
列举存储桶内对象
可以通过ListObjectsV2接口列举存储桶内的所有对象,示例代码如下:
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func listObjects(client *s3.Client, bucketName string) error {
output, err := client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
Bucket: &bucketName,
})
if err != nil {
return fmt.Errorf("列举对象失败: %v", err)
}
fmt.Printf("存储桶 %s 内的对象列表:n", bucketName)
for _, obj := range output.Contents {
fmt.Printf("对象键: %s, 大小: %d 字节, 最后修改时间: %vn", *obj.Key, *obj.Size, *obj.LastModified)
}
return nil
}
func main() {
client, err := initS3Client()
if err != nil {
log.Fatalf("初始化S3客户端失败: %v", err)
}
// 替换为你的存储桶名称
err = listObjects(client, "test-bucket-ipipp")
if err != nil {
log.Fatalf("列举失败: %v", err)
}
}
删除S3存储桶内的对象
删除对象只需要指定存储桶名称和对象键即可,示例代码如下:
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
func deleteObject(client *s3.Client, bucketName, objectKey string) error {
_, err := client.DeleteObject(context.TODO(), &s3.DeleteObjectInput{
Bucket: &bucketName,
Key: &objectKey,
})
if err != nil {
return fmt.Errorf("删除对象失败: %v", err)
}
return nil
}
func main() {
client, err := initS3Client()
if err != nil {
log.Fatalf("初始化S3客户端失败: %v", err)
}
// 替换为你的存储桶名称和要删除的对象键
err = deleteObject(client, "test-bucket-ipipp", "uploads/test.txt")
if err != nil {
log.Fatalf("删除失败: %v", err)
}
fmt.Println("对象删除成功")
}
注意事项
- 确保AWS凭证具有对应存储桶的操作权限,避免出现权限不足的错误
- 上传大文件时建议使用SDK提供的上传管理器,自动处理分片上传逻辑
- 存储桶名称需要符合AWS S3的命名规范,且全局唯一
- 操作完成后及时释放相关资源,避免内存泄漏