一、S3 基础概念:对象存储的核心设计
S3(Simple Storage Service) 是 AWS 提出的对象存储协议标准,其核心设计理念包括:
- 扁平化存储结构:数据以 对象(Object)形式存储于 桶(Bucket)中,无目录层级,仅通过唯一键(Key)寻址。
- HTTP RESTful API:通过标准 HTTP 方法(
PUT
/GET
/DELETE
)操作资源,天然跨平台、跨语言。 - 强扩展性:支持海量非结构化数据(图片、视频、日志等)的高并发存取。
- 元数据管理:每个对象可携带自定义元数据(如
Content-Type
、ETag
)
二、通过七牛云免费测试存储空间实现S3
-
进入七牛云管理页面,选择对象存储Kodo
-
点击空间管理 -> 新建空间 -> 输入存储空间名称 -> 存储区域
-
此时七牛云会询问是否绑定自己的是CDN加速域名,(学习使用当然没有对应的CDN加速域名),贴心的七牛云会给我们分配一个30天的临时测试域名。如果忘了,可以进入域名管理查看
-
创建AccessKey/SecretKey。点击右侧密钥管理,进入根据提示创建属于自己的AccessKey/SecretKey
三、根据创建空间的存储区域查询服务域名
服务域名_使用指南_对象存储 - 七牛开发者中心进入,查询对应的RegionID 及Endpoint即可,后面要用
四、编写测试代码实现
因为S3最初由AWS推行,后续各云厂商为了“抢人”。几乎都适配了Aws的API,所以我们就用AWS的API就行,也可以去对应的云厂商查看对应的API及用法
package article
import (
"bytes"
"context"
"io"
"os"
"testing"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/stretchr/testify/assert"
)
func TestS3(t *testing.T) {
// 使用七牛云的S3服务
cosId, ok := os.LookupEnv("QiNiuYunS3Key") //对应密钥管理里面的AccessKey
if !ok {
panic("没有找到环境变量 QiNiuYunS3Key ")
}
cosKey, ok := os.LookupEnv("QiNiuYunS3Secret")//对应密钥管理里面的SecretKey
if !ok {
panic("没有找到环境变量 QiNiuYunS3Key")
}
sess, err := session.NewSession(&aws.Config{
Credentials: credentials.NewStaticCredentials(cosId, cosKey, ""),
//创建空间时选择的区域,我选择的是华南-广东所以是这个值
Region: aws.String("cn-south-1"),
//对应Region的Endpoint
Endpoint: aws.String("https://s3-cn-south-1.qiniucs.com"),
// 强制使用 /bucket/key 的形态
S3ForcePathStyle: aws.Bool(true),
})
assert.NoError(t, err)
client := s3.New(sess)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
//上传到S3存储空间
_, err = client.PutObjectWithContext(ctx, &s3.PutObjectInput{
//创建的空间名,即桶名
Bucket: aws.String("xxxx"),
//桶key
Key: aws.String("12"),
//内容
Body: bytes.NewReader([]byte("这是一个测试文件用于测试s312")),
ContentType: aws.String("text/plain;charset=utf-8"),
})
assert.NoError(t, err)
//从S3存储空间获取数据
res, err := client.GetObjectWithContext(ctx, &s3.GetObjectInput{
Bucket: aws.String("xxxxx"),
Key: aws.String("12"),
})
assert.NoError(t, err)
data, err := io.ReadAll(res.Body)
assert.NoError(t, err)
t.Log(string(data))
}
五、总结
实现这个过程其实很简单,而且七牛云非常良心有30天的免费测试域名,以下是上面代码对应的需要的信息:
key | value |
---|---|
Bucket | 创建的存储空间名 |
Key | 存储空间内存储的名称 |
cosId | 密钥管理生成的AccessKey |
cosKey | 密钥管理生成的SecretKey |
Region | 服务域名种对应的创建存储空间时的区域 |
Endpoint | Region对应的Endpoint |